Ви не можете.
Посібник для 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++
це занадто галасливо, щоб бути корисним, воно засноване на застарілому першому виданні Ефективного C ++ та попереджає про конструкції, які є абсолютно дійсними C ++ (і щодо яких вказівки змінені в наступних виданнях книги.) Я не хочу бути попередив, що я не ініціалізував std::string
члена в своєму конструкторі; у нього є конструктор за замовчуванням, який робить саме те, що я хочу, чому я повинен писати, m_str()
щоб називати це? Ці -Weffc++
попередження , які були б корисні занадто складні для компілятора , щоб виявити точно (даючи помилкові негативи), і ті, які не є корисними, наприклад, ініціалізація всіх членів в явному вигляді, просто виробляють занадто багато шуму, що дає помилкові спрацьовування.
Люк Дантон подав чудовий приклад марних попереджень, -Waggregate-return
які майже напевно ніколи не мають сенсу для коду C ++.
тобто ви насправді не хочете всіх попереджень, ви просто думаєте, що робите.
Перегляньте посібник, прочитайте про них, вирішіть, що ви хочете включити, спробуйте. Читання посібника Вашого компілятора - це все-таки Good Thing TM , якщо скоротити скорочення та включити попередження, які ви не розумієте, - це не дуже гарна ідея, особливо якщо це уникати необхідності RTFM.
Кожен, хто просто вмикає все , мабуть, або робить це, тому що вони незрозумілі, тому що босий гострий голос сказав "ніяких попереджень".
Деякі попередження важливі, а деякі - ні. Ви повинні бути дискримінаційними або зіпсувати свою програму. Розглянемо, наприклад, -Wdouble-promotion
. Якщо ви працюєте над вбудованою системою, можливо, ви хочете цього; якщо ви працюєте в настільній системі, ви, мабуть, цього не робите. А ти хочеш -Wtraditional
? Я сумніваюся в цьому.
Редагувати: Див. Також -Wall-all, щоб увімкнути всі попередження , закриті як WONTFIX.
Редагувати 2: у відповідь на скаргу DevSolar щодо файлів, що потребують використання різних попереджень, залежно від версії компілятора, якщо -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))