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

评论

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

我当前正在使用Visual Studio 2005作为我的IDE。

然后默认情况下,您正在使用cl.exe编译器。

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

相关:编译器信息。

#1 楼

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




/E :预处理到stdout(类似于GCC的-E选项)

/P:预处理到文件


/EP:预处理到stdout而没有#line指令


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

评论


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

– WooDzu
2014年9月9日在8:00

@WooDzu使用NMAKE(nmake.exe)通过使用传统的makefile自动执行构建Visual C ++项目的任务。 〜msdn.microsoft.com/zh-CN/library/f35ctcxw.aspx

–拉索夫斯基
2015年3月17日在9:11



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

–smwikipedia
16-8-9的2:16



尝试使用MS编译器(cl)时,请确保您在VS Developer命令提示符下,而不是在命令提示符下。常规命令提示符下不提供编译器。

– dmytro.poliarush
19/12/25在11:30



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

– Laurie Stearn
1月17日8:42

#2 楼

大多数编译器都可以选择只运行预处理器。例如,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,由于我不是专家,我将其留给其他海报提供答案。

评论


gcc问题:stackoverflow.com/questions/3916979 / ...

– Ciro Santilli郝海东冠状病六四事件法轮功
16年1月17日在11:44

#3 楼

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

评论


VS2010中的“预处理到文件”。

– Rob W
13年1月1日在9:31

顺便说一句,该文件是在扩展名为.i的输出目录(例如Release,Debug)中创建的。

– Steed
2014年1月10日上午11:05

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

– IanH
2015年11月6日,19:45

请注意,对于我来说,在MSVC 2015上,.i文件不在输出目录中,而是在项目的中间目录中。如果您例如使用CMake生成项目。

–user1556435
17年12月18日在16:39

#4 楼

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

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


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

#5 楼

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

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


如果您想查看注释,请使用此: />
gcc -E -C -P -o result.c my_file.h


此页面上提供更多选项。

评论


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

–圣人
15年11月2日在22:48

#6 楼

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

#7 楼

在Visual Studio中,您可以使用/ P编译文件(或项目)。

#8 楼

正如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文件,其中包含预处理器输出。

#9 楼

CPIP是用Python编写的新的C / C ++预处理器。如果要对预处理文件进行详细的视觉表示,请试一试。

CPIP是用Python实现的C / C ++预处理器。大多数预处理器将预处理视为一项肮脏的工作,必须尽快完成。由于预处理器会抛弃大量有用的信息以尽可能便宜地获取结果,因此这可能很难在预处理阶段跟踪细微的缺陷。
很少有开发人员真正了解预处理,对许多人来说,这是一种晦涩难懂的黑魔法。 CPIP旨在通过记录预处理的每个细节来改善这一点,以便CPIP可以生成有关文件依赖项,宏使用等的一些奇妙的可视化信息。
CPIP并非旨在替代cpp(或任何其他已建立的)预处理程序),CPIP认为清晰度和理解比处理速度更重要。


#10 楼

在Windows OS上,此问题的简单答案是在DOS提示符下使用以下命令来查看预处理的文件:

CL /P /C myprogram.c


这将生成一个名为我的程序打开它,寻找扩展的预处理器。