我只是在正在处理的项目中发生了重新定义的冲突,并且在追查为什么它并非在所有平台上都发生时(结果按包含顺序排列),我偶然发现了以下无法解释的行为。

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/

10-11 14:20