2008-11-10 68 views
185

假设我有一个包含许多预处理指令的源文件。在预处理器完成之后可以看到它的外观吗?如何在Visual Studio中预处理后看到C/C++源文件?

+0

如果您提供了更多信息,例如您正在使用哪种编译器,这将有所帮助。 – JaredPar 2008-11-10 07:14:15

+0

我目前使用Visual Studio 2005作为我的IDE。 – Geo 2008-11-10 07:16:01

+0

然后默认情况下你正在使用cl.exe编译器。 – 2008-11-10 15:37:40

回答

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 /路径/到/包括/目录到其中任意一个,就像你有定期编译。

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

+0

gcc问题:http:// stackoverflow。在VS2010中的“预处理到文件”是如何运行的 - gcc-pre-processor-to-see-how-the-source-look-after-defined-are-e – 2016-01-17 11:44:45

6

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

8

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

89

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

+9

。 – 2013-11-01 09:31:41

18

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

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

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

5

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

我可以手动运行CL并添加/ P,但它失败了,因为我不知道在完整构建过程中无法被平台生成器激活的所有适当的命令行选项。所以我需要知道所有这些选项。

我的解决办法是去看看在build.log文件,发现执行

CL blah-blah-blah myfile.c

我复制这条线到剪贴板上线。 “blah-blah-blah”部分包含构建选项,并且非常庞大。

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

CL /P blah-blah-blah myfile.c

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

8

我不知道微软编译器的东西,但在GCC您可以使用此:

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

如果你想看到的评论使用:

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

更多选项上this page avaliable 。

2

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

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

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

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

2

在Windows操作系统,简单的一行回答这个问题是用在DOS下面的命令提示符下看到处理后的文件:

CL /P /C myprogram.c 

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

相关问题