preprocessor - 在包含顺序上,C 预处理器重新定义冲突依赖

  显示原文与译文双语对照的内容
0 0

我刚重新定义冲突的项目我正在筹备并在跟踪时下为什么不是发生在所有plattforms ( 变成了顺序包括),我偶然发现了以下的行为,我不能解释。

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另外我Linux分路器,gcc 。

时间:原作者:6个回答

0 0

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

所以,( 2 ) 你看到这些警告,因为它是在代码中生成,而在( 1 ) 中就会生成警告队列。h 等会被取消。 添加 -Wsystem-headers到编译选项在两种情况下,你将看到该警告。

原作者:
...