Теневая декларация не выдает никаких предупреждений - PullRequest
1 голос
/ 22 мая 2019

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 Ответ

4 голосов
/ 22 мая 2019

Заголовки в системных расположениях имеют отключенные предупреждения, если вы не передадите -Wsystem-headers.

С -Wsystem-headers -Wshadow вы должны получить это предупреждение, даже если файл находится в /usr/include.

Опция задокументирована в https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Warning-Options.html#Warning-Options:

-Wsystem-headers

Вывести предупреждающие сообщения для конструкций, найденных в системных заголовочных файлах. Предупреждения из системных заголовков обычно подавляются предположение, что они обычно не указывают на реальные проблемы и только затруднит чтение выходных данных компилятора. Используя это опция командной строки говорит GCC выдавать предупреждения от системных заголовков как если они произошли в коде пользователя. Тем не менее, обратите внимание, что использование -Wall в в сочетании с этой опцией не предупреждает о неизвестных прагмах в системные заголовки - для этого также необходимо использовать -Wunknown-pragmas.

Эмпирически -Wsystem-headers вызывает повторное появление предупреждения, но такое поведение можно считать ошибкой gcc, поскольку в пользовательском коде происходит затенение, а не системный заголовок, из которого происходит затененный глобал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...