当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何知道(在GCC中)何时声明给定的宏/预处理器符号?》经验,为你挑选了2个好方法。

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

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

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

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



1> Johannes Sch..:

你看 :

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

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



2> Max Lybbert..:

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

我知道解决方案.使用已定义为非法C++代码的符号编译文件(链接到使用'@'的文章).所以,对于GCC你会写

gcc my_file.c -Dfoo=@

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

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

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有