如何使用gcc显示预处理的宏(仅用户定义)?

时间:2015-05-21 23:14:51

标签: c debugging gcc macros

我知道" gcc -E main.c"选项提供预处理输出的所有值。有没有办法只扩展用户定义的宏?

例如

#define MACRO(z) z+z

c = a + (MACRO(z))

当我使用这个假设的gcc选项时,我应该看到:

c = a + (z+z)

我不想要扩展任何其他系统定义的MACRO。海湾合作委员会有选择吗?

2 个答案:

答案 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