Подтвердить что ты не робот

Как использовать clang++ с -std = С++ 11 -Weverything -Werror

Я хочу скомпилировать следующий файл (temp.cpp):

#include <iostream> 

class Foo {
public:
  Foo() = default;
};

int main(){
  std::cout << "Works!" << std::endl;
  return 0;
}

Со следующей командой: clang++ temp.cpp -o temp -std=c++11 -Weverything -Werror

Возникла ошибка:

temp.cpp: 5: 11: ошибка: определения по умолчанию несовместимы с С++ 98 [-Werror, -WС++ 98-compat]

Я понимаю, что есть предупреждение, подобное С++ 98-compat, и это часть всего. Как включить все предупреждения, кроме С++ 98-compat? Есть ли совместимый флаг С++ 11 для -Всего?

4b9b3361

Ответ 1

На самом деле вам, вероятно, не нужны все предупреждения, потому что ряд предупреждений можно считать стилистическими или субъективными, а другие (например, тот, с которым вы столкнулись) просто глупы в вашей ситуации.

-Weverything был первоначально построен по двум причинам:

  • обнаружение: довольно сложно в противном случае получить список всех доступных предупреждений
  • альтернатива черным спискам: с помощью gcc вы можете выбрать предупреждения, которые вы хотите применить (белый список), -Weverything вы вишневы выбираете те, которые вы не хотите применять; преимущество заключается в том, что при переходе на новую версию компилятора вы, скорее всего, выиграете от новых предупреждений.

Очевидно, что обнаружение на самом деле не совместимо с производством; поэтому вы, похоже, попадаете в черный список.

Система диагностики Clang выведет (по умолчанию) название самой конкретной группы предупреждений, которая отвечает за генерацию предупреждения (здесь -Wc++98-compat), и каждую группу предупреждений можно отключить, добавив no- сразу после -W.

Поэтому для черного списка вы получаете:

-Weverything -Wno-c++98-compat -Wno-...

И вам рекомендуется периодически пересматривать список вносимых в черный список предупреждений (например, при обновлении до более нового компилятора).