假设我有一个包含许多预处理器指令的源文件。预处理器完成后是否可以看到它的外观?
10 回答
cl.exe
,Microsoft Visual C++ 的命令行界面,具有用于输出预处理文件的三个不同选项(因此在先前关于 Visual C++ 的响应中存在不一致):
/E
:预处理到标准输出(类似于 GCC 的 -E 选项)/P
:预处理到文件/EP
:在没有#line 指令的情况下预处理到标准输出
如果要对没有#line 指令的文件进行预处理,请结合/P
和/EP
选项。
大多数编译器都可以选择只运行预处理器。 例如,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,我将把它留给其他海报提供答案,因为我不是那里的专家。
右键单击解决方案资源管理器上的文件,转到属性。在 Configuration Properties->C/C++->Preprocessor 下,“生成预处理文件”就是您要查找的内容。然后在解决方案资源管理器中右键单击该文件并选择“编译”。预处理文件在输出目录(例如Release、Debug)中创建,扩展名为.i(感谢Steed 的评论)。
您通常需要对预处理器的输出进行一些后处理,否则所有宏都只是扩展为一个行,这很难阅读和调试。对于 C 代码,类似以下内容就足够了:
gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c
对于 C++ 代码,它实际上要困难得多。对于 GCC/g++,我发现这个 Perl 脚本很有用。
cl /EP
如果您使用的是 Microsoft 的 C++ 编译器,请尝试一下。
我对 Microsoft 编译器一无所知,但在 GCC 上你可以使用它:
gcc -E -P -o result.c my_file.h
如果您想查看评论,请使用:
gcc -E -C -P -o result.c my_file.h
此页面提供更多选项。
在 Visual Studio 中,您可以使用 /P 编译文件(或项目)。
正如 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 文件,其中包含预处理器输出。
CPIP是一个用 Python 编写的新的 C/C++ 预处理器。如果您想要预处理文件的详细视觉表示,请试一试。
CPIP 是用 Python 实现的 C/C++ 预处理器。大多数预处理器将预处理视为一项必须尽快完成的肮脏工作。这使得在预处理阶段追踪细微缺陷变得非常困难,因为预处理器会丢弃许多有用的信息,以尽可能便宜地获得结果。
很少有开发人员真正了解预处理,对许多人来说,这是一种晦涩难懂的黑魔法。CPIP 旨在改进这一点,并通过记录预处理的每一个细节,以便 CPIP 可以生成一些关于文件依赖关系、宏使用等的精彩视觉信息。
CPIP 并非旨在替代 cpp(或任何其他已建立的预处理器),而是 CPIP 认为清晰度和理解比处理速度更重要。
在 Windows 操作系统上,此问题的简单单行答案是在 DOS 提示符下使用以下命令查看预处理文件:
CL /P /C myprogram.c
这将生成一个名为myprogram.i的文件。打开它并查看您的扩展预处理器。