Отключение предупреждения gcc "доступно только с -std = c ++ XX или -std = gnu ++ XX" - PullRequest
8 голосов
/ 15 апреля 2019

Некоторые языковые функции в более поздних языковых стандартах невероятно полезны, и производители компиляторов решили перенести их в более ранние версии. Наиболее существенным примером этого является if constexpr.

Эта простая программа:

template <typename T>
constexpr int get() {
    if constexpr (sizeof(T) > 10) {
        return 1;
    } else {
        return 0;
    }
}

static_assert(get<int>() == 0, "!");
static_assert(get<char[100]>() == 1, "!");

технически требует C ++ 17 в соответствии с правилами языка и технически плохо сформирован в C ++ 11 ... но и gcc, и clang компилируют его просто отлично на -std=c++11 в любом случае. Каждый из них выдает предупреждение.

Clang сообщает вам, что это за предупреждение, чтобы вы могли его отключить:

foo.cxx:3:8: warning: constexpr if is a C++17 extension [-Wc++17-extensions]
    if constexpr (sizeof(T) > 10) {
       ^
1 warning generated.

Компиляция clang с -Wno-C++17-extensions не выдает предупреждений.

Но gcc на самом деле не говорит, откуда исходит предупреждение:

foo.cxx: In function ‘constexpr int get()’:
foo.cxx:3:8: warning: ‘if constexpr’ only available with -std=c++17 or -std=gnu++17
     if constexpr (sizeof(T) > 10) {
        ^~~~~~~~~

Есть ли способ отключить это предупреждение? Я знаю, что это «доступно только» в C ++ 17, но есть причины , чтобы еще не перейти на полный C ++ 17.

1 Ответ

2 голосов
/ 20 июня 2019

Как прокомментировал Марк, единственный способ остановить эти предупреждения в текущих выпусках GCC - сообщить компилятору, что ваш код находится в системном заголовке. Это происходит автоматически, если код находится в заголовке, найденном в одном из стандартных включаемых путей GCC, например /usr/include, и происходит автоматически, если код находится в заголовке, найденном с помощью параметра -isystem. Вы также можете украсить заголовок, чтобы GCC обрабатывал его как системный заголовок независимо от каталога, в котором он находится, с помощью:

#pragma GCC system_header

Если код не находится в заголовочном файле, то нельзя сказать, что он находится в системном заголовке. Любой исходный файл, который не является # include, не будет считаться системным заголовком, независимо от того, в каком каталоге он находится, или вы используете # pragma.

...