阴影声明不会产生任何警告

时间:2019-05-22 14:30:58

标签: c gcc

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;
}

这是预期的行为吗?我当时想在这两种情况下都会打印警告

1 个答案:

答案 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错误,因为这种过错发生在用户代码中,而不是发生过这种过阴影的全局系统头。