假设我有一个带有许多预处理器指令的源文件。是否有可能看到它在预处理器完成后的样子?


当前回答

大多数编译器都有只运行预处理器的选项。例如,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,我将把它留给其他人来提供答案,因为我不是这方面的专家。

其他回答

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

我可以手动运行CL并添加/P,但它失败了,因为我不知道Platform Builder在完整构建期间无形地激活的所有适当的命令行选项。所以我需要知道所有的选项。

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

CL等等myfile。c

我把这行复制到剪贴板上。“废话”部分包含构建选项,而且非常大。

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

CL /P等等myfile.c

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

大多数编译器都有只运行预处理器的选项。例如,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,我将把它留给其他人来提供答案,因为我不是这方面的专家。

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

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

如果您希望预处理到一个没有#line指令的文件,请结合/P和/EP选项。

我对微软编译器一无所知,但在GCC上你可以使用这个:

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

如果你想看到注释,使用这个:

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

本页有更多选项。

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

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

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