Що робить “-Wall” у “g ++ -Wall test.cpp -o test”?


92

-o змінює ім'я вихідного файлу (я виявив, що використання --help)

Але я не можу з'ясувати, що -Wallробить?


7
"man gcc" на вашій консолі розповідає вам все про цей прапор і простий пошук у Google за допомогою "gcc -Wall" ...
Девід Сотер

Як загальну пораду, спробуйте прочитати manзаписи програм, якщо ви хочете знати, що робить комутатор або які комутатори доступні. manСторінка gccможе бути прочитана на linux.die.net/man/1/gcc - ви можете зробити швидкий пошук там для тексту «-Wall»
gnud

6
@David Sauter, Google не знайде нічого з "-wall". Це виключить усі "стіни" з пошуку.
Кирило Васильович Лядвінський

@Kirill Ні, якщо ви використовуєте лапки, як я здогадуюсь, це означає Девід
gnud

1
//, я завжди думав, що це данина поваги Ларрі Уолл.
Натан Басанес

Відповіді:


110

Це скорочення від "попереджати всіх" - воно включає (майже) всі попередження, про які g ++ може вам розповісти. Зазвичай хороша ідея, особливо якщо ви новачок, оскільки розуміння та виправлення цих попереджень може допомогти вам вирішити безліч різних видів проблем у вашому коді.


24
Більше попереджень (деякі з них досить корисні) можна ввімкнути за допомогою -Wextraта -pedantic.
gnud

7
Це ще (майже) не все. Насправді це лише дуже мала частка доступних попереджень. Це ті, з якими погоджуються "всі". Дійсно хороша ідея полягає в тому, щоб зробити -Wall -Wextra, а потім уважно переглянути керівництво , щоб знайти , як багато більше попереджень ви могли б дозволити , як це можливо, тому що навіть -Wextraце лише невелика частина ...
DevSolar

@DevSolar дуже хороший момент. Чи знаєте ви, чи є прапор, що означає "буквально всі попередження"?
MatrixFrog

1
@MatrixFrog: На жаль, такого варіанту не існує, принаймні не для компіляторів, яких я знаю. І список доступних попереджень змінюється з часом ... якби команда GCC не відключила -Wunreachable-codeдеякий час назад, Apple би набагато щасливіша в наші дні. ;-)
DevSolar

36

Дивіться man gcc.

-Wall включає ці попередження:

-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat -Wchar-subscripts
-Wenum-compare (in C/Objc; this is on by default in C++) -Wimplicit-int (C and
 Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) 
-Wcomment -Wformat -Wmain (only for C/ObjC and unless -ffreestanding) 
-Wmissing-braces -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type 
-Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing 
-Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized -Wunknown-pragmas 
-Wunused-function -Wunused-label -Wunused-value -Wunused-variable 
-Wvolatile-register-var

-Wextra містить:

-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers
-Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init
-Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused
 or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall)

Є набагато більше застережень, які ви повинні чітко ввімкнути.

Наприклад, для нашого коду С, який ми використовуємо:

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-optimization -Wdiv-by-zero -Wendif-labels -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wjump-misses-init -Wlogical-op -Werror = missing-braces -Wmissing-аб'яви -Wno-missing-format-attribute -Wmissing-include-dirs -Wmultichar -Wpacked -Wpointer-arith -Wreturn-type -Wsequence-point -Wsign-compare -Wstrict-aliasing -Wstrict-aliasing = 2 -Wswitch -Wswitch-default -Werror = undef -Wno-unused -Wvariadic-macros -Wwrite-strings -Wc ++ -1

або просто набір попереджень за допомогою https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html


19

На жаль, жодна з відповідей не цитує фактично відповідну частину посібника, що насправді доводить це до суті:

Це включає всі попередження щодо конструкцій, які деякі користувачі вважають сумнівними, і яких легко уникнути (або змінити, щоб запобігти попередженню), навіть у поєднанні з макросами.

[...]

Зверніть увагу, що деякі попереджувальні прапори не передбачаються -Wall. Деякі з них попереджають про конструкції, які користувачі зазвичай не вважають сумнівними, але які іноді ви можете перевірити; інші попереджають про конструкції, яких необхідно або важко уникати в деяких випадках, і немає простого способу модифікувати код, щоб придушити попередження. Деякі з них увімкнені, -Wextra але багато з них мають бути активовані окремо.

Ерго:

  • -Wallзовсім НЕ означає , «все попередження».
  • Це також не означає "(майже) все", не з далекого пострілу.
  • Він має в увазі набір окремих варіантів , які пов'язані змінити .

Підсумок, це приблизно абсолютний мінімум попереджень, які ви повинні встановити. Хоча -Wall -Wextraце краще, він все ще не використовує всі перевірки помилок, які ваш компілятор може зробити для вас.


Особисто я не піду на менше, ніж -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual. У всіх моїх поточних проектах фактично використовується список попереджень, довший за цей (не запускаючи жодного з них). І я перевіряю посібник кожного головного випуску на наявність нових опцій. Компілятор - ваш друг. Використовуйте будь-яку діагностику, яку вона може запропонувати вам.


Я почав вчитися програмуванню за допомогою C ++. Я використовую принципи програмування та практикую використання cpp . Моя система - ubuntu 16.04, я використовую vscode як свій редактор. Чи рекомендуєте ви мені використовувати ваш -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualпід час компіляції, g++ -std=c++11поки я вивчаю C ++ та програмування? Або мені слід пропустити цю частину і пізніше почати використовувати прапорці повідомлень про помилки? Якщо так, коли слід починати з повідомлень про помилки?
scientific_explorer

2
@vkv: Я вважаю, що компілятор - це насправді твій друг, і ти повинен скористатися кожною гарною порадою, яку він може тобі дати.
DevSolar

6

Це дає змогу попередженням, які автори GCC вважають корисними та легко уникнути їх у джерелі. Існує також -W (-Wextra в нових версіях), які вважаються корисними, але для яких обхід помилкових спрацьовувань може бути складним або призвести до незграбного коду.

gcc має також купу інших попереджень, загалом менш корисних. Див. Http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#Warning-Options


2

Це enables most warning messages.

Ви можете дізнатись більше, якщо користуєтесь g++ --help=warnings.


0

Це дозволяє всі попередження. (читається як "Попередження всім")


Насправді існує багато попереджень, які він не вмикає (наприклад, невіртуальний dtor у класі з віртуальними методами).
Mark B

див. відповідь Ювала: -Wallпросто означає "більшість попереджень" замість "усі попередження".
HaxtraZ

-1

Він відображає всі попередження. Я б рекомендував також використовувати -pedanticдля попередження про деякі невідповідні частини коду.


Для документації gcc: "Деякі користувачі намагаються використовувати -pedantic для перевірки програм на суворе відповідність стандарту ISO C. Вони незабаром виявляють, що він робить не зовсім те, що вони хочуть: він знаходить деякі практики, що не належать до ISO, але не всі - лише ті, для яких ISO C вимагає діагностики та деяких інших, для яких була додана діагностика ".
Програміст,

Це не дає 100% гарантії, але допомагає.
Кирило Васильович Лядвінський

1
Якби ви не написали деякі замість усіх у "для попередження про всі невідповідні частини", я б не коментував. Але ваше поточне формулювання просто поширює хибну думку, від якої попереджає документація GCC.
Програміст,

Виправлено. Але на практиці це скоріше виглядає як "більшість", а не "частина".
Кирило Васильович Лядвінський,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.