找到中断编译的#define
Locate the #define that breaks the compilation
我遇到了一个情况,其中一个头文件中的#define打破了另一个头文件中的enum声明。
使用-E
在gcc
上的开关,我已经建立了
#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等下使用。
- 二叉排序树无法编译
- 编译时未启用intel oneApi CUDA支持
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 除了使用 #define 进行条件编译之外,还有其他选择吗?
- #define xyz在#include预编译标题之前
- visual在源代码中是否有预定义的#define或其他方式来了解它是为C++/CX Windows运行时编译的
- 在#define中编译时出错
- 使用 #pragma message() 打印编译期间 #define 的完整评估结果
- 根据编译时常量,使用相同的标识符 #define 或类型定义是否被认为是可接受的做法?
- 使用Makefile编译的预处理器指令(#define)列表
- 找到中断编译的#define
- 如何避免公共头中#define编译时间过长
- 如何检查哪个 #define 被编译成二进制文件
- 如何在编译时检查像"#define VERSION 3.1.4"这样的值?
- 根据 #define 动态编译文件
- numpy ctype 如果不是每次都重新编译,"dynamic module does not define init function"错误
- #define在预编译头文件中无法识别.mm文件