找到中断编译的#define

Locate the #define that breaks the compilation

本文关键字:#define 编译 中断      更新时间:2023-10-16

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

使用-Egcc上的开关,我已经建立了

#define OFF 0

问题是,我如何找到在哪里?这个项目非常庞大,有几十个包含目录,数百个包含文件。我将做一个全局grep最终,但问题是,有没有办法问gcc编译器在哪里#define发生?它显然有这些信息!

更新:感谢不是一个而是两个解决方案-所以通过。请注意,罪魁祸首是Sybase客户端库的一个include (ctlib,甚至不是dblib)。哎哟。

您可以重新定义它(为不同的值)。然后gcc会告诉你它已经在哪里定义了。

在我的系统中是这样的:

在文件中包含从 from < another file >:13:

& lt;头文件的重定义值>:30:1:> warning: "<定义>" redefined "

& lt;命令行>:warning:这是前一个的位置定义

使用-dD和-E选项。两者都启用后,您将看到预处理结果,其中包括定义。只需查找您的宏(如#define OFF 1)并向上滚动到# number filename,就可以找到最后一个包含文件,因此它是定义宏的文件。

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

:ta myfunction

查找myfunction的定义。这对于用#define创建的宏同样有效,它支持c语言以外的各种语言。我使用的是exhuberant标签,这是如果你在rhell系统上安装ctags所得到的,但它当然可以在Debian, Ubuntu, OS X等下使用。