Как параметр компилятора -I может вызывать разные триггеры предупреждений? - PullRequest
2 голосов
/ 07 мая 2020

Недавно мне было поручено реструктурировать приложение, и я столкнулся с довольно странной проблемой. Я как можно лучше свел проблему к образцу кода. Рассмотрим следующее:

offender.h

__attribute__ ((visibility ("default")))
typedef struct A {
    int a;
} A;

test. cpp:

#include <iostream>

#include <offender.h>

int main(void)
{
    A a;
    a.a = 10;
    std::cout << a.a << "\n";
    return 0;
}

Если я бегу:

g++ -Wall -Werror -o test -I. test.cpp
In file included from test.cpp:3:
./offender.h:4:3: error: ‘visibility’ attribute ignored [-Werror=attributes]
    4 | } A;
      |   ^
cc1plus: all warnings being treated as errors
make: *** [Makefile:3: all] Error 1

Однако это имеет смысл, если я перемещу offender.h в системный путь и скомпилирую без -I. Я получаю следующее:

sudo mv offender.h /usr/local/include/
g++ -Wall -Werror -o test test.cpp

Предупреждение не срабатывает.

Как возможно, что предупреждение возникает, если я включаю файл заголовка из текущего каталога, но работает нормально, если я включаю его из предопределенный каталог include? Что мне не хватает?

Это было протестировано с g ++ 7.5.0 (Ubuntu 18.04) и 9.3.0 (Ubuntu 20.04), оба генерируют один и тот же результат.

Edit: прояснил проблему

1 Ответ

4 голосов
/ 08 мая 2020

Документация говорит

Заголовочные файлы, объявляющие интерфейсы к операционной системе и библиотекам времени выполнения, часто не могут быть записаны в строгом соответствии с C. Таким образом, G CC дает коду, находящемуся в системных заголовках, особую обработку. Все предупреждения, кроме тех, которые генерируются с помощью '#warning' (см. Диагностика), подавляются, пока G CC обрабатывает системный заголовок.

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