gpt4 book ai didi

C 预处理器根据包含顺序重新定义冲突

转载 作者:太空狗 更新时间:2023-10-29 16:41:11 26 4
gpt4 key购买 nike

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

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 机器上得到了相同的结果。

最佳答案

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

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

关于C 预处理器根据包含顺序重新定义冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13903201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com