我知道" gcc -E main.c"选项提供预处理输出的所有值。有没有办法只扩展用户定义的宏?
例如
#define MACRO(z) z+z
c = a + (MACRO(z))
当我使用这个假设的gcc选项时,我应该看到:
c = a + (z+z)
我不想要扩展任何其他系统定义的MACRO。海湾合作委员会有选择吗?
答案 0 :(得分:1)
实际上,您要做的是让预处理器忽略打开包含文件的错误。我认为有一个编译器具有这样的功能,但GCC并不是这样。 (或者我可能会将它与GCC功能混淆,以在生成依赖项文件时忽略丢失的包含文件。)
但是,您可以做的是创建一个空文件的影子目录,该目录与系统头的所有名称和子目录相匹配。然后,您可以使用-nostdinc
(忽略系统包含目录)和-I
选项(指向新的影子目录)。
可以使用以下内容创建影子目录:
mkdir $HOME/tmp/emptystdinc
cd $HOME/tmp/emptystdinc
find /usr/include -type d -print | sed 's|/usr/include|.|' | xargs mkdir -p
find /usr/include -type f -print | sed 's|/usr/include|.|' | xargs touch
现在看看你的后处理代码是什么样的:
cc -E -nostdinc -I$HOME/tmp/emptystdinc test.c
祝你好运!这对我来说很好用!
答案 1 :(得分:0)
从cpp
手册页引用:
-undef 不要预定义任何特定于系统或GCC的宏。标准预定义宏仍然定义。
这意味着将展开__FILE__
或__LINE__
等宏,但这可能足以满足您的需求。您还可以使用-U
取消定义这些标准预定义宏。完整列表可以找到here。