找到打破编译的#define

我遇到一种情况,其中一个头文件中的#define在另一个头文件中打破了枚举声明。

gcc上使用-E开关我已经确定了我的

 #define OFF 0 

某处。

问题是,我怎么找出哪里? 该项目规模庞大,包括几十个目录,数百个包含文件。 我最终会做一个全局grep,但问题是,有没有办法问gcc编译器在哪里发生#define? 它显然有这些信息!

更新:感谢不是一个而是两个解决方案 – SO来了。 仅仅是为了记录,罪魁祸首是Sybase客户端库的包含之一(ctlib,甚至不是dblib)。 哎哟。

您可以重新定义它(到不同的值)。 然后gcc将告诉你它已经定义的位置。

在我的系统上它看起来像这样:

中包含的文件中:27,

  from < another file >:13: 

<带有重新定义值的头文件>:30:1:>警告:“”已重新定义

:警告:这是前一个定义的位置

将选项-dD与-E一起使用。 启用这两个后,您将看到包含定义的预处理结果。 只需找你宏(如#define OFF 1)并向上滚动到# number filename ,然后找到最后一个包含文件,因此它就是定义宏的那个。

一个好的解决方案是运行类似“ctags”的东西,它基本上构建了代码中定义的符号数据库。 然后,许多流行的编辑器(vim,emacs)将读取标签文件,让您快速按名称跳转到定义。 例如,使用vim我只需输入:

 :ta myfunction 

找到myfunction的定义。 这同样适用于使用#define创建的宏,并且它支持除C以外的各种语言。我正在使用exhuberant ctags ,如果你在RHEL-ish系统上安装ctags就会得到它,但它肯定可以在Debian,Ubuntu,OS X等等。