在Visual Studio中进行预处理后,如何查看C / C ++源文件?


206

假设我有一个包含许多预处理程序指令的源文件。可以看到预处理器完成后的外观吗?


如果您提供了更多信息(例如正在使用的编译器),将会有所帮助。
JaredPar

我目前正在使用Visual Studio 2005作为IDE。
地理

然后默认情况下,您使用的是cl.exe编译器。
马丁·约克

3
当他说他正在使用VS2005时,为什么会接受gcc答案?
Jim Buck

Answers:


147

cl.exe,即Microsoft Visual C ++的命令行界面,具有用于输出预处理文件的三个不同选项(因此,先前有关Visual C ++的响应中存在不一致的地方):

如果要预处理为没有#line指令的文件,请组合/P/EP选项。


1
如何将这些命令传递给具有nmake和Makefile的项目?
WooDzu 2014年

@WooDzu使用NMAKE(nmake.exe)通过使用传统的makefile自动执行生成Visual C ++项目的任务。〜msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky

8
请注意,这/P将禁止生成obj文件。因此,如果放置/P选项,则可能会得到一个链接错误,提示无法找到某些obj文件,因为实际上根本没有生成该文件。
smwikipedia '16

尝试使用MS编译器()时,请确保您所在的位置VS Developer command prompt不是。常规命令提示符下不提供编译器。Command promptcl
dmytro.poliarush

VS2019社区:/ P LNK 1104错误仍然在印刷机上很热。
Laurie Stearn

119

大多数编译器都可以选择只运行预处理器。 例如,gcc提供-E:

   -E  Stop after the preprocessing stage; do not run the compiler proper.  
       The output is in the form of preprocessed source code, which is sent
       to the standard output.

这样就可以运行:

gcc -E foo.c

如果找不到这样的选项,则还可以在计算机上找到C预处理器。它通常称为cpp,可能已经在您的路径中了。像这样调用它:

cpp foo.c

如果需要从其他目录中包含标头,则可以像常规编译一样将-I / path / to / include / dir传递给其中任何一个。

对于Windows,由于我不是专家,我将其留给其他海报提供答案。



100

右键单击解决方案资源管理器上的文件,转到“属性”。在“配置属性”->“ C / C ++”->“预处理器”下,您正在寻找“生成预处理文件”。然后在解决方案资源管理器中右键单击该文件,然后选择“编译”。在输出目录(例如Release,Debug)中创建带有扩展名.i的预处理文件(感谢Steed的评论)。


9
VS2010中的“预处理到文件”。
罗布W

18
顺便说一句,在输出目录(例如在创建文件ReleaseDebug用扩展名).i
Steed

1
这很有帮助,因为它使用项目中已经设置的构建配置来查找所有正确的标题。
IanH 2015年

请注意,对于我来说,在MSVC 2015上,.i文件不在“ 输出目录”中,而是在项目的“ 中间目录”中。如果您使用CMake生成项目,则它们是不同的。
user1556435 '17

19

通常,您需要对预处理器的输出进行一些后处理,否则所有宏都只能扩展为一个衬板,这很难读取和调试。对于C代码,满足以下条件即可:

gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c

对于C ++代码,实际上要困难得多。对于GCC / g ++,我发现此Perl脚本很有用。


8

我对Microsoft编译器一无所知,但是在GCC上,您可以使用以下代码:

gcc -E -P -o result.c my_file.h

如果您想查看评论,请使用:

gcc -E -C -P -o result.c my_file.h

此页面上还有更多选项。


1
这也适用于gcc派生的编译器,例如qcc.exe-谢谢!
圣人

8

cl /EP如果您使用的是Microsoft的C ++编译器,请尝试。



5

正如bk1e和Andreas M.的回答,编译器的/ P选项将导致它预处理文件。但是,在我使用VS2005和Platform Builder(用于嵌入式ARM处理器)的项目中,该项目未在对话框中显示选项(如Jim B所述)以启用该选项。

我可以手动运行CL并添加/ P,但是失败了,因为我不知道在整个构建过程中Platform Builder会无形地激活所有适当的命令行选项。所以我需要知道所有这些选项。

我的解决方案是查看build.log文件,并找到执行的行

CL blah-blah-blah myfile.c

我将此行复制到剪贴板。“ blah-blah-blah”部分包含构建选项,并且很大。

回到IDE中,我右键单击myfile.c,选择“打开构建窗口”,然后在该窗口中粘贴构建命令行,并添加“ / P”。

CL /P blah-blah-blah myfile.c

做完了 生成了myfile.i文件,其中包含预处理器输出。


2

CPIP是用Python编写的新的C / C ++预处理器。如果要详细了解预处理文件的外观,请试一下。

CPIP是用Python实现的C / C ++预处理器。大多数预处理器将预处理视为一项肮脏的工作,只是必须尽快完成。由于预处理器会抛弃大量有用的信息,从而以尽可能便宜的价格获得结果,因此在预处理阶段很难跟踪细微的缺陷。

很少有开发人员真正了解预处理,对许多人来说,这是晦涩难懂的黑魔法。CPIP旨在通过记录预处理的每一个细节来改善这一点,以便CPIP可以产生一些关于文件依赖项,宏使用情况等奇妙的视觉信息。

CPIP并非旨在替代cpp(或任何其他已建立的预处理程序),而是CPIP认为清晰度和理解比处理速度更重要。


2

在Windows操作系统上,此问题的简单一行答案是在DOS提示符下使用以下命令来查看经过预处理的文件:

CL /P /C myprogram.c

这将生成一个名为myprogram.i的文件。打开它,寻找扩展的预处理器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.