假设我有一个带有许多预处理器指令的源文件。是否有可能看到它在预处理器完成后的样子?
当前回答
大多数编译器都有只运行预处理器的选项。例如,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,我将把它留给其他人来提供答案,因为我不是这方面的专家。
其他回答
在Visual Studio中,您可以使用/P编译文件(或项目)。
大多数编译器都有只运行预处理器的选项。例如,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,我将把它留给其他人来提供答案,因为我不是这方面的专家。
我对微软编译器一无所知,但在GCC上你可以使用这个:
gcc -E -P -o result.c my_file.h
如果你想看到注释,使用这个:
gcc -E -C -P -o result.c my_file.h
本页有更多选项。
cl.exe, Microsoft Visual c++的命令行接口,有三个不同的选项来输出预处理文件(因此在前面关于Visual c++的响应中不一致):
/E:预处理到stdout(类似于GCC的-E选项) /P:预处理到文件 /EP:预处理到标准输出,不使用#line指令
如果您希望预处理到一个没有#line指令的文件,请结合/P和/EP选项。
您通常需要对预处理器的输出进行一些后处理,否则所有宏都将扩展为一行,这很难读取和调试。对于C代码,像下面这样的代码就足够了:
gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c
对于c++代码,这实际上要难得多。对于GCC/g++,我发现这个Perl脚本很有用。
推荐文章
- C多行宏:do/while(0) vs作用域块
- 找出质数最快的算法是什么?
- 我如何调试git/git-shell相关的问题?
- time_t最终的类型定义是什么?
- 我需要显式处理负数或零时,总和平方数字?
- c++枚举类可以有方法吗?
- 函数名周围的括号是什么意思?
- 用C语言创建自己的头文件
- Visual Studio拒绝忘记断点?
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- 将析构函数设为私有有什么用?
- main()中的Return语句vs exit()
- 为什么c#不提供c++风格的'friend'关键字?
- 如果不是内存地址,C指针到底是什么?
- 如何在Python自己的调试器(PDB)中执行多行语句