gra*_*hel 12 c redefine c-preprocessor
我刚刚在我正在进行的项目中有一次重新定义的冲突,并且在追踪为什么它没有在所有平台上发生(原来是按包含顺序)时,我偶然发现了以下无法解释的行为.
#define LIST_HEAD(a) { int a = 0; }
#include <sys/queue.h>
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#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到您的编辑选项,您将在两种情况下看到警告.
| 归档时间: |
|
| 查看次数: |
505 次 |
| 最近记录: |