C预处理器重新定义依赖于包含顺序的冲突

gra*_*hel 12 c redefine c-preprocessor

我刚刚在我正在进行的项目中有一次重新定义的冲突,并且在追踪为什么它没有在所有平台上发生(原来是按包含顺序)时,我偶然发现了以下无法解释的行为.

1.没有警告地编译

    #define LIST_HEAD(a) { int a = 0; }                                                                                                                     
    #include <sys/queue.h>                                                          

    int main() {                                                                    
        return 0;                                                               
    }
Run Code Online (Sandbox Code Playgroud)

2."宏重新定义"警告

    #include <sys/queue.h>
    #define LIST_HEAD(a) { int a = 0; }                                                                                                       

    int main() {                                                                    
        return 0;                                                               
    }
Run Code Online (Sandbox Code Playgroud)

我希望这两种情况都能产生警告,因为没有任何检查<sys/queue.h>会阻止重新定义.

那么为什么第一种情况不产生警告,而第二种情况呢?我在这里缺少什么?

顺便说一句:我在Mac上用clang和我的Linux机箱用gcc得到了相同的结果.

Joh*_*all 13

默认情况下,系统标头中会禁止此警告.代码<sys/queue.h>被认为来自系统头,因为通过搜索标记为包含系统头的路径找到了sys/queue.h.

因此,在(2)中,您会看到警告,因为它是在您的代码中生成的,而在(1)中,警告是在queue.h中生成的,因此被抑制.添加-Wsystem-headers到您的编辑选项,您将在两种情况下看到警告.