假设我在各种头文件中都有#define foo.它可能扩展到一些不同的东西.我想知道(当编译.cc文件时)遇到#define时,它将扩展到什么,它是哪个文件以及它包含在哪里.
可能吗?如果没有,是否有任何可能有帮助的部分解决方案?
随意添加评论和澄清请求.
编辑:当有一个#define并且我只想跳到定义或知道定义是什么时,当前答案似乎集中在这种情况下.这是一个简单的案例,是的,您的解决方案是有效的.但是当我在不同的文件中使用相同的#define,并且想要知道哪个#define首先开始时,这些技术都没有用.好吧,我实际上小心翼翼地使用#warning来找到合适的地方.但这需要很多工作.
你看 :
# 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.
注意:评论正确地抱怨这只是部分解决方案.它不会告诉您何时更换宏.它会向您显示预处理源,无论如何都可以提供帮助.
我想知道(在编译.cc文件时)遇到#define时,
我知道解决方案.使用已定义为非法C++代码的符号编译文件(链接到使用'@'的文章).所以,对于GCC你会写
gcc my_file.c -Dfoo=@
当它扩展时,它保证会导致语法错误,编译器应该告诉你哪个文件存在语法错误,这将非常有用.
如果您使用Raymond Chen建议的技巧,编译器可能会告诉您"冲突"定义的来源,并可能会列出如何包含它.但是没有保证.由于我不使用宏(我更喜欢const和enum),我不能说GCC是否是这方面更聪明的编译器之一.我不相信C或C++标准对此有所说明,除了预处理器运行之后你会失去各种有用的信息.