12

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

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>会阻止重新定义。

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

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

4

1 回答 1

14

默认情况下,此警告在系统标头中被抑制。中的代码<sys/queue.h>被认为来自系统头文件,因为sys/queue.h是通过搜索标记为包含系统头文件的路径找到的。

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

于 2012-12-16T16:44:27.893 回答