Я хотел бы включить - буквально - ВСЕ предупреждения, которые имеет GCC. (Вы думаете, это будет легко ...)
Вы могли бы подумать, что
-Wall
можно сделать, но нет! Все еще нужно-Wextra
.Вы могли бы подумать, что
-Wextra
можно сделать, но нет! Не все перечисленные здесь предупреждения (например,-Wshadow
) включены этим. И я до сих пор не знаю, является ли этот список всеобъемлющим.
Как мне сказать GCC включить (нет, если, и, или но!) Все предупреждения, которые он имеет?
c++
gcc
warnings
compiler-warnings
gcc-warning
user541686
источник
источник
-Weverything
.Ответы:
Ты не можешь
Руководство по GCC 4.4.0 является исчерпывающим только для этой версии, но в нем перечислены все возможные предупреждения для 4.4.0. Они не все на странице, на которую вы ссылаетесь, например, некоторые языковые опции находятся на страницах для опций C ++ или Obj-C. Чтобы найти их все, вам лучше посмотреть обзор вариантов
Включение всего включает в себя то,
-Wdouble-promotion
что относится только к процессорам с 32-разрядным модулем с плавающей запятой одинарной точности, который реализуетсяfloat
аппаратно, но эмулируетсяdouble
программно. Делать расчеты так, какdouble
бы использовать программную эмуляцию и быть медленнее. Это актуально для некоторых встроенных процессоров, но совершенно не актуально для современных настольных процессоров с аппаратной поддержкой 64-битной плавающей запятой.Другое предупреждение, которое обычно бесполезно, -
-Wtraditional
это предупреждение об идеально правильно сформированном коде, который имеет другое значение (или не работает) в традиционных C, например"string " "concatenation"
, или определениях функций ISO C! Вы действительно заботитесь о совместимости с 30-летними компиляторами? Вы действительно хотите предупреждение для записиint inc(int i) { return i+1; }
?Я думаю, что
-Weffc++
это слишком шумно, чтобы быть полезным, оно основано на устаревшей первой редакции Effective C ++ и предупреждает о конструкциях, которые совершенно допустимы в C ++ (и для которых руководящие принципы изменились в более поздних выпусках книги). Я не хочу быть предупредил, что я не инициализировалstd::string
член в своем конструкторе; у него есть конструктор по умолчанию, который делает именно то, что я хочу, почему я должен писать,m_str()
чтобы вызвать его? Эти-Weffc++
предупреждения , которые были бы полезны слишком сложны для компилятора , чтобы обнаружить точно (давая ложные негативы), и те, которые не является полезными, например, инициализация всех членов в явном виде, просто производят слишком много шума, что дает ложные срабатывания.Люк Дантон привел отличный пример бесполезных предупреждений,
-Waggregate-return
которые почти наверняка не имеют смысла для кода C ++.то есть вы действительно не хотите всех предупреждений, вы просто думаете, что хотите.
Просмотрите руководство, прочитайте о них, решите, какие из них вы можете включить, попробуйте их. Чтение руководства вашего компилятора это хорошая вещь ТМ в любом случае, принимая короткую стрижку и включение предупреждений вы не понимаете, не очень хорошая идея, особенно если это , чтобы избежать необходимости RTFM.
Любой, кто просто включает все , вероятно, либо делает это, потому что он не имеет ни малейшего понятия, потому что или босс с заостренными волосами сказал «никаких предупреждений»
Некоторые предупреждения важны, а некоторые нет. Вы должны быть разборчивы или вы испортили свою программу. Рассмотрим, например,
-Wdouble-promotion
. Если вы работаете над встроенной системой, вы можете захотеть этого; если вы работаете в настольной системе, то, вероятно, нет. А ты хочешь-Wtraditional
? Я сомневаюсь в этом.Редактировать: См. Также -Wall-все, чтобы включить все предупреждения, которые закрываются как WONTFIX.
Редактировать 2: в ответ на жалобу DevSolar о том, что make-файлам нужно использовать разные предупреждения в зависимости от версии компилятора, если
-Wall -Wextra
это не подходит, то нетрудно использовать CFLAGS для конкретного компилятора и для конкретной версии:источник
-Weverything
Я думаю, что это лучшее решение, чем стратегия gcc, не предусматривающая такой опции. Я использую этот флаг с clang, потому что моя философия заключается в том, что я хочу, чтобы все предупреждения были включены по умолчанию (потому что кто-то считал, что это достаточно полезно для добавления в компилятор), и если мне это не нравится, я специально отключаю это предупреждение. Дело в том, что вы не знаете о предупреждениях, которые не срабатывают, но вы знаете о предупреждениях, которые не должны срабатывать, и они легко отключаются.-Weverything
опции Clang , но невозможно с GCC.Я согласен с предыдущими ответами, что, вероятно, нецелесообразно включать буквально все предупреждения, однако GCC предоставляет достаточно удобный способ для достижения этой цели. Команда
предоставляет список всех поддерживаемых параметров предупреждений с информацией о том, активны ли они. Это, кстати, может быть использовано, чтобы узнать, какие опции (не) включены, например,
-Wall
и-Wextra
Чтобы включить все предупреждения, вы можете использовать некоторые регулярные выражения для извлечения параметров командной строки
Для моего текущего GCC это дает:
Теперь это можно использовать для вызова GCC, т.е.
Однако обратите внимание, что это приводит к появлению предупреждений, поскольку некоторые параметры предупреждений доступны только для определенных языков (например,
C++
). Этого можно избежать, используя еще несколько регулярных выражений, чтобы включить только параметры, разрешенные для текущего языка, или добавив соответствующие-Wno-whatever
в конце вызова.источник
-isystem
вместо-I
соответствующих каталогов.Просто невозможно запрограммировать все включенные предупреждения (если вы не собираетесь их игнорировать, но зачем тогда беспокоиться?). Например, давайте предположим , что вы используете следующий набор флагов:
-Wstrict-prototypes -Wtraditional
.Даже если включены два предупреждения, следующая программа будет жаловаться.
Вы можете подумать: «Ну, тогда я собираюсь использовать прототипы старого стиля». Нет, это не сработает.
И нет, не указывать ни один прототип тоже неправильно, так как компилятор тоже будет жаловаться.
Если вы определяете какие-либо функции внутри вашей программы, вы не можете использовать все флаги, потому что компилятор будет жаловаться на любое мыслимое определение функции.
Для C ++ это возможно (
-Wtraditional
флаг не существует), и очень простые программы могут быть скомпилированы. Чтобы включить все предупреждения, используйте следующий список предупреждений (возможно, некоторые предупреждения дублированы, потому что я не удосужился отфильтровать включенные предупреждения-Wall
).источник
int main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
Кто-то создал набор инструментов для определения полного набора предупреждений для данной версии GCC или Clang.
Для GCC копирование из полного списка предупреждений, предоставленных этим инструментом для вашей версии компилятора, представляется единственным способом обеспечить включение всех предупреждений, поскольку (в отличие от Clang) GCC не предоставляет
-Weverything
.Похоже, что инструмент анализирует фактический
c.opt
файл в исходном коде GCC, поэтому его результаты должны быть окончательными.Хранилище также содержит текстовые файлы со списками предупреждений, созданными для большинства версий GCC и Clang (в настоящее время Clang с 3.2 по 3.7 и GCC с 3.4 по 5.3).
https://github.com/barro/compiler-warnings
источник
Gcc 4.3+ теперь имеет -Q --help = warnings, вы даже можете указать --help = warnings, C, чтобы просто распечатать предупреждения, связанные с C.
Я только что написал модуль m4, чтобы воспользоваться этим (также поддерживает clang's -Weverything), см. Wget_manywarnings.m4
Как использовать это довольно просто, в основном модуль включает каждый флаг предупреждения. И вы удаляете предупреждения по мере необходимости - некоторые действительно очень многословны. Пример: configure.ac
Если вы не используете autotools, вы найдете код для включения всех отключенных предупреждений в модуле m4, который в основном представляет собой вызов gcc, передаваемый через awk:
flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'
источник
С этой страницы :
Я думаю, вопрос в том, какие ? Возможно, вы могли бы выполнить поиск этой страницы для всех строк, начинающихся с -W, и получить полный список флагов предупреждений. Затем сравните их со списками под
-Wall
и-Wextra
. Существует также-Wpedantic
, хотя вы, очевидно, хотите быть еще более педантичным все еще =)источник
Возможно, это так, но единственный список, который на 100% исчерпывающий, - это фактический источник для компилятора. Тем не менее, GCC большой ! И я не знаю, все ли параметры командной строки собраны в одном месте или распределены по нескольким исходным файлам. Также обратите внимание, что некоторые предупреждения относятся к препроцессору, некоторые - к фактическому компилятору, а некоторые - к компоновщику (который является совершенно отдельной программой и находится в пакете binutils), поэтому они, скорее всего, распространены.
источник