Убедитесь, что g ++ не компилирует программу с использованием функций, добавленных в более новые версии C ++ - PullRequest
1 голос
/ 28 апреля 2020

Компиляция с флагом -std=c++14 компилирует программы, которые также используют функции, реализованные в более новых версиях C ++, выдавая предупреждение, подобное следующему:

warning: inline variables are only available with -std=c++17 or -std=gnu++17

Я не хочу, чтобы g ++ компилировал программу в этой ситуации и не знаю, почему это происходит в первую очередь.

Я обнаружил, что добавление флага -Werror преобразует вышеприведенное предупреждение в ошибку, гарантируя, что программа не компилируется, но я не уверен, что это рекомендуемый способ сделать это.

1 Ответ

1 голос
/ 30 апреля 2020

Чтобы спровоцировать ошибки компилятора специально для использования языковых функций, которые допустимы только в стандартах C ++ позже, чем выбранный вами, наилучшим вариантом диагностики c является, вероятно, -pedantic-errors, что задокументировано

-pedanti c -errors

Выдает ошибку, когда базовый стандарт (см. -Wpedanti c) требует диагностики c , в некоторых случаях, когда существует неопределенное поведение во время компиляции, а в некоторых других случаях, которые не мешают компиляции программ, которые действуют в соответствии со стандартом ...

[мой акцент]

«Базовым стандартом» здесь является стандарт C ++, названный указанным значением или значением по умолчанию -std=... (или если это диалект GNU, такой как gnu++14, то это стандарт C ++, на котором этот диалект based).

Если вы скомпилируете исходный код, скажем, с std=c++14, который использует конструкцию, впервые легализованную в C ++ 17, то этот код некорректен согласно стандарту C ++ 14 и диагностике. c quired. Следовательно, добавление -pedantic-errors к -std=c++14 обязывает компилятор диагностировать инновации C ++ 17 как ошибки.

Например, без -pedantic-errors

$ cat foo.cpp
struct foo
{
    inline static const int value = 42;
};

$ g++ -std=c++14 -Wall -Wextra -pedantic -c foo.cpp
foo.cpp:3:5: warning: inline variables are only available with ‘-std=c++17’ or ‘-std=gnu++17’
    3 |     inline static const int value = 42;
      |     ^~~~~~

И с -pedantic-errors

$ g++ -std=c++14 -Wall -Wextra -pedantic-errors -c foo.cpp
foo.cpp:3:5: error: inline variables are only available with ‘-std=c++17’ or ‘-std=gnu++17’
    3 |     inline static const int value = 42;
      |     ^~~~~~

-pedantic-errors сделает компилятор более суетливым в отношении соответствия C ++ 14, чем сам по себе std-c++14 или с -Werror. Но я думаю, вы не будете возражать против этого. И вы можете сделать неограниченный выбор относительно того, будете ли вы практиковать общую дисциплину компиляции с нулевыми предупреждениями (-Werror)

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