Ты не можешь
Руководство по 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 для конкретного компилятора и для конкретной версии:
compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))