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

时间:2008-11-10 07:11:09

标签: c++ c debugging visual-studio-2005 c-preprocessor

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

10 个答案:

答案 0 :(得分:144)

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

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

答案 1 :(得分:118)

大多数编译器都可以选择运行预处理器。 例如,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 /传递给/ include / dir,就像使用常规编译一样。

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

答案 2 :(得分:94)

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

答案 3 :(得分:18)

您通常需要对预处理器的输出进行一些后处理,否则所有宏只会扩展为一个内存,这很难读取和调试。对于C代码,类似下面的内容就足够了:

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

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

答案 4 :(得分:8)

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

答案 5 :(得分:8)

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

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

如果你想看到评论,请使用:

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

this page上有更多选项可供选择。

答案 6 :(得分:6)

在Visual Studio中,您可以使用/ P。

编译文件(或项目)

答案 7 :(得分: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,选择“Open Build Window”,然后在该窗口中粘贴了构建命令行,并添加了“/ P”。

CL /P blah-blah-blah myfile.c

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

答案 8 :(得分:2)

CPIP是一个用Python编写的新C / C ++预处理器。如果您想要预处理文件的详细直观表示,请试一试。

  CPIP是一个用Python实现的C / C ++预处理器。大多数预处理器都将预处理视为一项必须尽快完成的肮脏工作。由于预处理器丢弃了许多有用的信息,有利于尽可能便宜地获得结果,因此很难在预处理阶段追踪细微的缺陷。

     

很少有开发人员真正理解预处理,对许多人来说这是一个模糊的黑魔法。 CPIP旨在改进这一点并记录预处理的每个细节,以便CPIP可以生成一些关于文件依赖性,宏使用等的奇妙可视信息。

     

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

答案 9 :(得分:2)

在Windows操作系统上,回答这个问题的简单方法是在DOS提示符下使用以下命令查看预处理文件:

CL /P /C myprogram.c

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