我遇到一种情况,其中一个头文件中的#define在另一个头文件中打破了枚举声明.
使用-E开关gcc我已经确定我有
#define OFF 0
Run Code Online (Sandbox Code Playgroud)
某处.
问题是,我怎么找出哪里?该项目规模庞大,包括几十个目录,数百个包含文件.我最终会做一个全局grep,但问题是,有没有办法让gcc编译器在哪里发生#define?它显然有这些信息!
更新:感谢不是一个而是两个解决方案 - SO来了.仅仅是为了记录,罪魁祸首是Sybase客户端库的包含之一(ctlib,甚至不是dblib).哎哟.
lit*_*adv 15
您可以重新定义它(到不同的值).然后gcc将告诉你它已经定义的位置.
在我的系统上它看起来像这样:
在<some file>中包含的文件中:27,
Run Code Online (Sandbox Code Playgroud)from < another file >:13:<带有重新定义值的头文件>:30:1:>警告:"<define>"已重新定义
<command-line>:警告:这是前一个定义的位置
将选项-dD与-E一起使用.启用这两个后,您将看到包含定义的预处理结果.只需找你宏(如#define OFF 1)并向上滚动# number filename,然后找到最后一个包含文件,因此它是定义宏的那个.