如何运行GCC预处理器来获取扩展后的宏(如#define)代码?

ujv3wf0j  于 10个月前  发布在  其他
关注(0)|答案(4)|浏览(97)

GCC预处理器是否可以生成C源代码并过滤掉不相关的源代码?
例如,一个.c文件有一个#define开关要为许多不同的平台定义,我只对一个平台感兴趣,我希望C预处理器过滤掉不相关的代码。

GCC是否支持此功能?

k0pti3hp

k0pti3hp1#

是。使用-E选项:

gcc -E foo.c

字符串

9cbw7uwe

9cbw7uwe2#

虽然-E选项将执行所有预处理,但它也会产生一些非常“原始”的输出,这些输出可能不是您想要的(取决于您想要的)。
如果你需要调试一个宏扩展,而这个宏扩展没有达到你的预期,E是一个很好的方法。如果你只是想过滤掉“不活动的代码”,但保留剩余的代码或多或少的原始形式,你可能想看看下面堆栈溢出问题的答案:

bwitn5fc

bwitn5fc3#

听起来你想要的是unifdef,而不是GCC预处理器。

ulydmbyx

ulydmbyx4#

为了完整起见:如果你只想运行 * 预处理器 *,你也可以使用cpp

cpp foo.c

字符串
参考https://gcc.gnu.org/onlinedocs/cpp/Invocation.html
在大多数情况下,当你使用C预处理器时,你不必显式地调用它:C编译器会自动执行此操作。然而,预处理器有时也会单独使用。您可以使用cpp命令或通过gcc -E调用预处理器。在GCC中,预处理器实际上与编译器集成在一起,而不是单独的程序,这两个命令都会调用GCC,并告诉它在预处理阶段结束后停止。
cpp命令需要两个文件名作为参数,infileoutfile。预处理器将infile与它用'#include'指定的任何其他文件一起读取。组合输入文件生成的所有输出都写入 outfile

相关问题