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

假设我有一个包含许多预处理指令的源文件。 在预处理器完成之后,是否有可能看到它的外观?

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

  • /E : 预处理到标准输出 (类似于GCC的-E选项)
  • /P : 预处理到文件
  • /EP : 预处理到没有#line指令的stdout

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

大多数编译器可以select运行预处理器。 例如 ,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 

如果你找不到这样的选项,你也可以在你的机器上findC预处理器。 它通常被称为CPP,可能已经在你的path。 像这样调用它:

 cpp foo.c 

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

对于Windows,我将把它留给其他海报来提供答案,因为我不是那里的专家。

右键单击解决scheme资源pipe理器上的文件,转到属性。 在configuration属性 – > C / C ++ – >预处理器下,“生成预处理文件”就是你要找的。 然后右键单击解决scheme资源pipe理器中的文件并select“编译”。 预处理文件是在输出目录(例如Release,Debug)中创build的,扩展名为.i(感谢Steed的评论)。

您通常需要对预处理器的输出进行一些后处理,否则所有的macros都会扩展为一行,这很难读取和debugging。 对于C代码,像下面这样的东西就足够了:

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

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

我不知道任何有关微软编译器,但在GCC上,你可以使用这个:

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

如果你想看到评论使用这个:

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

更多的选项在此页面上可用。

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

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

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

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

我的解决scheme是去查看build.log文件,并find执行的行

CL blah-blah-blah myfile.c

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

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

CL /P blah-blah-blah myfile.c

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

CPIP是一个用Python编写的新的C / C ++预处理器。 如果你想要一个预处理文件的详细的视觉表示,给它一个镜头。

CPIP是一个用Python实现的C / C ++预处理器。 大多数预处理器将预处理视为一项肮脏的工作,只需要尽快完成即可。 这可能使得在预处理阶段很难追踪细微的缺陷,因为预处理器会丢弃大量有用的信息,以便尽可能便宜地获得结果。

很less有开发人员真正理解预处理,对很多开发人员来说,这是一个晦涩难懂的黑魔法。 CPIP旨在改善这一点,并通过logging预处理的每个细节,CPIP可以产生一些关于文件依赖性,macros观使用情况等的可视化信息。

CPIP不是为了替代cpp(或任何其他已build立的预处理器),而是CPIP将清晰度和理解视为比处理速度更重要。

在Windows操作系统上,这个问题的一个简单的答案就是在DOS提示符下使用下面的命令来查看预处理文件:

 CL /P /C myprogram.c 

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