GCC预处理器是否可以生成C源代码并过滤掉不相关的源代码?例如,一个.c文件有一个#define开关要为许多不同的平台定义,我只对一个平台感兴趣,我希望C预处理器过滤掉不相关的代码。
.c
#define
GCC是否支持此功能?
k0pti3hp1#
是。使用-E选项:
-E
gcc -E foo.c
字符串
9cbw7uwe2#
虽然-E选项将执行所有预处理,但它也会产生一些非常“原始”的输出,这些输出可能不是您想要的(取决于您想要的)。如果你需要调试一个宏扩展,而这个宏扩展没有达到你的预期,E是一个很好的方法。如果你只是想过滤掉“不活动的代码”,但保留剩余的代码或多或少的原始形式,你可能想看看下面堆栈溢出问题的答案:
E
bwitn5fc3#
听起来你想要的是unifdef,而不是GCC预处理器。
ulydmbyx4#
为了完整起见:如果你只想运行 * 预处理器 *,你也可以使用cpp:
cpp
cpp foo.c
字符串参考https://gcc.gnu.org/onlinedocs/cpp/Invocation.html:在大多数情况下,当你使用C预处理器时,你不必显式地调用它:C编译器会自动执行此操作。然而,预处理器有时也会单独使用。您可以使用cpp命令或通过gcc -E调用预处理器。在GCC中,预处理器实际上与编译器集成在一起,而不是单独的程序,这两个命令都会调用GCC,并告诉它在预处理阶段结束后停止。cpp命令需要两个文件名作为参数,infile 和 outfile。预处理器将infile与它用'#include'指定的任何其他文件一起读取。组合输入文件生成的所有输出都写入 outfile。
gcc -E
4条答案
按热度按时间k0pti3hp1#
是。使用
-E
选项:字符串
9cbw7uwe2#
虽然
-E
选项将执行所有预处理,但它也会产生一些非常“原始”的输出,这些输出可能不是您想要的(取决于您想要的)。如果你需要调试一个宏扩展,而这个宏扩展没有达到你的预期,
E
是一个很好的方法。如果你只是想过滤掉“不活动的代码”,但保留剩余的代码或多或少的原始形式,你可能想看看下面堆栈溢出问题的答案:bwitn5fc3#
听起来你想要的是unifdef,而不是GCC预处理器。
ulydmbyx4#
为了完整起见:如果你只想运行 * 预处理器 *,你也可以使用
cpp
:字符串
参考https://gcc.gnu.org/onlinedocs/cpp/Invocation.html:
在大多数情况下,当你使用C预处理器时,你不必显式地调用它:C编译器会自动执行此操作。然而,预处理器有时也会单独使用。您可以使用
cpp
命令或通过gcc -E
调用预处理器。在GCC中,预处理器实际上与编译器集成在一起,而不是单独的程序,这两个命令都会调用GCC,并告诉它在预处理阶段结束后停止。cpp
命令需要两个文件名作为参数,infile 和 outfile。预处理器将infile与它用'#include'指定的任何其他文件一起读取。组合输入文件生成的所有输出都写入 outfile。