218

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

4

10 回答 10

161

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

如果要对没有#line 指令的文件进行预处理,请结合/P/EP选项。

于 2008-11-10T08:33:17.533 回答
123

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

于 2008-11-10T07:15:27.270 回答
108

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

于 2008-11-10T07:18:50.163 回答
21

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

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

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

于 2008-11-10T08:06:13.580 回答
9

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

于 2008-11-10T07:16:14.100 回答
8

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

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

如果您想查看评论,请使用:

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

此页面提供更多选项。

于 2013-03-06T23:16:57.797 回答
6

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

于 2008-11-10T07:15:54.647 回答
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,选择“打开构建窗口”,然后在该窗口中粘贴构建命令行,并添加一个“/P”。

CL /P blah-blah-blah myfile.c

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

于 2013-01-24T19:38:21.280 回答
3

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

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

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

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

于 2014-10-04T07:00:42.770 回答
2

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

CL /P /C myprogram.c

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

于 2015-01-31T02:24:45.553 回答