我只是在正在处理的项目中发生了重新定义的冲突,并且在追查为什么它并非在所有平台上都发生时(结果按包含顺序排列),我偶然发现了以下无法解释的行为。
1.编译时无警告
#define LIST_HEAD(a) { int a = 0; }
#include <sys/queue.h>
int main() {
return 0;
}
2.“宏重新定义”警告
#include <sys/queue.h>
#define LIST_HEAD(a) { int a = 0; }
int main() {
return 0;
}
我希望这两种情况都会产生警告,因为
<sys/queue.h>
中没有检查可以防止重新定义。那么为什么第一种情况不发出警告,而第二种情况却发出警告呢?我在这里想念的是什么?
顺便说一句:在使用clang的Mac和使用gcc的Linux机器上,我得到相同的结果。
最佳答案
默认情况下,此警告在系统标题中被禁止。 <sys/queue.h>
中的代码被视为来自系统头,因为sys/queue.h是通过搜索标记为包含系统头的路径找到的。
因此,在(2)中您会看到警告,因为它是在您的代码中生成的,而在(1)中中,该警告是在queue.h中生成的,因此被取消。将-Wsystem-headers
添加到您的编译选项中,在两种情况下您都会看到警告。
关于C预处理程序根据包含顺序重新定义冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13903201/