2008-11-14 53 views
9

假设我在各种头文件中有#define foo。它可能扩展到一些不同的东西。我想知道(编译.cc文件时)遇到#define时,它将展开的内容,它是哪个文件以及它包含在哪里。如何知道(在GCC中)给定的宏/预处理器符号何时被声明?

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

随意添加意见和澄清请求。

编辑:当前的答案似乎专心的情况下有一个#define和我只是想跳到定义或知道的定义是什么。这是简单的情况,是的,你的解决方案工作。但是当我在不同的文件中有相同的#define,并且想知道哪一个是先踢的时候,这些技术都没有用处。好的,我真的使用#warning仔细找到正确的地方。但这需要很多工作。

+0

当你在编译时运行宏时,你想要它做什么? – 2008-11-14 18:33:14

+0

@Greg:打印信息:这样的和刚刚定义的。将扩展到(...)。这是在文件(...),行(...)中。包括从(一个“回溯#includes回到我的.cc文件)。 – 2008-11-14 18:42:45

+1

我对任何软件都有一个很不好的感觉,因为这有什么不同。 – 2008-11-14 22:17:17

回答

17

使用-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 

的内部是线标记海合会当你读它的输出是有点混乱。 -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.

注:评论正确地抱怨这只能解决部分问题。它不会告诉你宏何时会被替换。它向您显示预处理的源代码,无论如何这可能会有所帮助。

+0

This在整个文件中工作,而不是单独的#define,并且它不提供@phjr正在寻找的其余信息 – 2008-11-14 18:57:19

0

使用#警告。它的描述为here

+1

目前还不清楚`#warning`会在这里起什么作用 – skyking 2016-02-15 10:01:13

1

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

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

2

它不会帮助你找到它的定义,但你可以使用-E -dM标志查看特定文件中的定义

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

好的IDE可以为您的需求通​​过某种做到这一点跳转到定义的形式。

5

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

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

gcc my_file.c [email protected] 

时膨胀它保证引起语法错误,编译器会告诉你哪些文件语法错误是,这将是非常有益的。

如果您使用的伎俩雷蒙德陈指出,编译器可能告诉你,这里的“相互矛盾”的定义是从哪里来的,和可能给你这是怎么列入名单。但是没有保证。由于我不使用宏(我更喜欢const和枚举),我不能说GCC是这方面更智能的编译器之一。我不相信C或C++标准对此有任何说明,除非预处理器运行一次,否则将失去各种有用的信息。