gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
我的系统上安装了一个库dev软件包,其中包含用于编译二进制文件的标头。头文件之一的外部声明看起来像
test.h
:
#ifndef AAA
#define AAA
typedef struct test test;
#endif
我的二进制文件是
main.c
#include <lib/test.h>
int main(void){
test *test = NULL; //no warning produced
(void) test;
}
使用-Wshadow
进行编译时,不会产生警告。但是,如果我包含一个与声明相同的手写文件
mytest.h
:
#ifndef AAA
#define AAA
typedef struct test test;
#endif
main.c
#include "mytest.h"
int main(void){
//warning: declaration of ‘test’ shadows a global declaration [-Wshadow]
test *test = NULL;
(void) test;
}
这是预期的行为吗?我当时想在这两种情况下都会打印警告
答案 0 :(得分:4)
除非您通过-Wsystem-headers
,否则系统位置的标题都将禁用警告。
使用-Wsystem-headers -Wshadow
,即使文件位于/usr/include
中,您也应该得到该警告。
该选项记录在https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Warning-Options.html#Warning-Options中:
-Wsystem标题
为在系统头文件中找到的结构打印警告消息。来自系统标题的警告通常会被禁止 假设它们通常不表示实际问题,并且 只会使编译器的输出难以阅读。使用这个 命令行选项告诉GCC从系统标头发出警告,如下所示: 如果它们出现在用户代码中。但是,请注意,在 与此选项一起使用时不会警告以下情况: 系统标头-为此,还必须使用-Wunknown-pragmas。
凭经验,-Wsystem-headers
会再次显示警告,但是该行为可以被视为gcc错误,因为这种过错发生在用户代码中,而不是发生过这种过阴影的全局系统头。