如何知道(在GCC中)何时声明给定的宏/预处理器符号?

时间:2008-11-14 18:28:19

标签: c++ gcc c-preprocessor

假设我在各种头文件中都有#define foo。它可能扩展到一些不同的东西。我想知道(当编译.cc文件时)遇到#define时,它会展开什么,它是哪个文件以及它包含在哪里。

有可能吗?如果没有,是否有任何可能有帮助的部分解决方案?

随意添加评论和澄清请求。

编辑:当有一个#define并且我只想跳转到定义或知道定义是什么时,当前的答案似乎集中在这种情况上。这是一个简单的案例,是的,您的解决方案是有效的。但是当我在不同的文件中使用相同的#define,并且想要知道哪个#define首先开始时,这些技术都没有用。好吧,我实际上小心翼翼地使用#warning来找到合适的地方。但这需要做很多工作。

6 个答案:

答案 0 :(得分:18)

使用-E:

# shows preprocessed source with cpp internals removed
g++ -E -P file.cc
# shows preprocessed source kept with macros and include directives 
g++ -E -dD -dI -P file.cc  

上面的内部是gcc的行标记,当你读取输出时有点混乱。 -P剥离它们

 -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.

     Input files which don't require preprocessing are ignored.

注意:评论正确地抱怨这只是部分解决方案。它不会告诉您何时更换宏。它会向您显示预处理的来源,无论如何都可以提供帮助。

答案 1 :(得分:5)

  

我想知道(在编译.cc文件时)遇到#define时,

I know a solution to that。使用已定义为非法C ++代码的符号编译文件(链接到使用'@'的文章)。所以,对于GCC,你会写

gcc my_file.c -Dfoo=@

当扩展它时,保证会导致语法错误,编译器应该告诉你哪个文件出现语法错误,这将非常有用。

如果您使用Raymond Chen建议的技巧,编译器可以告诉您“冲突”定义的来源,可能会列出其如何获得包括在内。但是没有保证。由于我不使用宏(我更喜欢const和enum),我不能说GCC是否是这方面更聪明的编译器之一。我不相信C或C ++标准对此有所说明,除了预处理器运行之后,你会失去各种有用的信息。

答案 2 :(得分:2)

它不会帮助您找到它的定义位置,但您可以使用-E -dM标记来查看特定文件的定义

g++ -E -dM file.cpp | grep MACRO

答案 3 :(得分:1)

对于“它将扩展的东西”我在gcc中使用-E开关,它给出了预处理的输出。但是没有回溯哪个宏来自哪里(或者如果有一个宏)。

您可能使用的另一个选项是-g3,这会添加有关宏的调试信息,即稍后您可以在调试器中看到每个宏的定义。

答案 4 :(得分:1)

一个好的IDE可以通过某种形式的跳转到定义来按需执行此操作。

答案 5 :(得分:0)

使用#warning。它描述了here