假设我有一个带有许多预处理器指令的源文件。是否有可能看到它在预处理器完成后的样子?
当前回答
大多数编译器都有只运行预处理器的选项。例如,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,我将把它留给其他人来提供答案,因为我不是这方面的专家。
其他回答
在解决方案资源管理器上右键单击该文件,转到属性。在配置属性->C/ c++ ->预处理器下,“生成预处理文件”就是你要找的。然后在解决方案资源管理器中右键单击该文件并选择“编译”。预处理文件在输出目录(例如Release, Debug)中创建,扩展名为.i(感谢Steed的评论)。
如果您正在使用微软的c++编译器,请尝试cl /EP。
在Visual Studio中,您可以使用/P编译文件(或项目)。
在Windows操作系统上,这个问题的简单答案是在DOS提示符中使用以下命令查看预处理文件:
CL /P /C myprogram.c
这将生成一个名为myprogram.i的文件。打开它并查看扩展的预处理器。
cl.exe, Microsoft Visual c++的命令行接口,有三个不同的选项来输出预处理文件(因此在前面关于Visual c++的响应中不一致):
/E:预处理到stdout(类似于GCC的-E选项) /P:预处理到文件 /EP:预处理到标准输出,不使用#line指令
如果您希望预处理到一个没有#line指令的文件,请结合/P和/EP选项。
推荐文章
- decltype(auto)的一些用途是什么?
- Shared_ptr转换为数组:应该使用它吗?
- 使用C返回一个数组
- Printf与std::字符串?
- 禁用复制构造函数
- 只接受特定类型的c++模板
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 如何为KnockoutJS调试模板绑定错误?
- 为什么pthreads的条件变量函数需要互斥?
- c++ 11中的递归lambda函数
- 如何在构建目标之外生成gcc调试符号?
- 在c++中指针使用NULL或0(零)吗?
- 在c++中,如何将int值附加到字符串中?
- __FILE__宏显示完整路径
- 就性能而言,使用std::memcpy()还是std::copy()更好?