Que fait «-Wall» dans «g ++ -Wall test.cpp -o test»?


92

-o change le nom du fichier de sortie (j'ai trouvé cela en utilisant --help)

Mais je ne peux pas savoir ce que -Wallfait?


7
"man gcc" sur votre console vous dit tout sur ce drapeau et une simple recherche google avec "gcc -Wall" aussi ...
David Sauter

En guise de conseil général, essayez de lire les manentrées des programmes si vous voulez savoir ce que fait un commutateur ou quels commutateurs sont disponibles. La manpage de gccpeut être lue sur linux.die.net/man/1/gcc - vous pouvez y faire une recherche rapide pour le texte "-Wall"
gnud

6
@David Sauter, Google ne trouvera rien avec "-wall". Cela exclura tout "mur" de la recherche.
Kirill V. Lyadvinsky

@Kirill Pas si vous utilisez des citations, comme je suppose que David veut dire
gnud

1
//, j'ai toujours pensé que c'était un hommage à Larry Wall.
Nathan Basanese le

Réponses:


110

C'est l'abréviation de "warn all" - il active (presque) tous les avertissements dont g ++ peut vous informer. C'est généralement une bonne idée, surtout si vous êtes débutant, car comprendre et corriger ces avertissements peut vous aider à résoudre de nombreux types de problèmes dans votre code.


24
D'autres avertissements (dont certains sont très utiles) peuvent être activés avec -Wextraet -pedantic.
gnud

7
Ce n'est pas (presque) tout. Il ne s'agit en fait que d'une très petite fraction des avertissements disponibles. Ce sont ceux sur lesquels «tous» sont d'accord. La vraiment bonne idée est de faire -Wall -Wextra, puis parcourir le manuel pour trouver autant d' autres avertissements que vous pouvez activer possible, car même -Wextraest seulement un petit sous - ensemble ...
DevSolar

@DevSolar très bon point. Savez-vous s'il existe un drapeau qui signifie «littéralement tous les avertissements»?
MatrixFrog

1
@MatrixFrog: Malheureusement, une telle option n'existe pas, du moins pas pour les compilateurs que je connais. Et la liste des avertissements disponibles change au fil du temps ... si l'équipe GCC n'avait pas désactivé il y a -Wunreachable-codequelque temps, Apple serait beaucoup plus heureux ces jours-ci. ;-)
DevSolar

36

Voir man gcc.

-Wall active ces avertissements:

-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 contient:

-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)

Il existe de nombreux autres avertissements que vous devez activer explicitement.

Par exemple, pour notre code C, nous utilisons:

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-optimisation -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 = accolades-manquantes -Wmissing-declarations -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-inutilisé -Wvariadic-macros -Wwrite-strings -Wc ++ -compat -Werror = déclaration-après-instruction -Werror = déclaration-de-fonction-implicite -Wmissing-prototypes -Werror = imbriquées-externs -Werror = ancienne-définition -Werror = strict-prototypes

ou simplement l'ensemble des avertissements avec https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html


19

Malheureusement, aucune des réponses ne cite la partie réellement pertinente du manuel, ce qui l'amène vraiment à un point:

Cela active tous les avertissements sur les constructions que certains utilisateurs considèrent comme douteuses, et qui sont faciles à éviter (ou à modifier pour empêcher l'avertissement), même en conjonction avec des macros.

[...]

Notez que certains indicateurs d'avertissement ne sont pas impliqués par -Wall. Certains d'entre eux mettent en garde contre des constructions que les utilisateurs ne considèrent généralement pas comme discutables, mais que vous voudrez peut-être parfois vérifier; d'autres avertissent des constructions qui sont nécessaires ou difficiles à éviter dans certains cas, et il n'y a pas de moyen simple de modifier le code pour supprimer l'avertissement. Certains d'entre eux sont activés par, -Wextra mais beaucoup d'entre eux doivent être activés individuellement.

Ergo:

  • -Wallne signifie pas «tous les avertissements».
  • Cela ne veut pas dire non plus «(presque) tout», pas de loin.
  • Il ne signifie pas un ensemble d'options individuelles qui est lié à changer .

En bout de ligne, il s'agit du minimum absolu d'avertissements que vous devez définir. Bien que ce -Wall -Wextrasoit mieux, il n'utilise toujours pas toutes les erreurs de vérification que votre compilateur peut faire pour vous.


Personnellement, je n'irais pas pour moins de -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual. Tous mes projets actuels utilisent en fait une liste d'avertissements plus longue que cela (sans déclencher aucun d'entre eux). Et je vérifie le manuel sur chaque version majeure pour de nouvelles options. Le compilateur est votre ami. Utilisez tous les diagnostics qu'il peut vous offrir.


J'ai commencé à apprendre la programmation en C ++. J'utilise les principes de programmation et je pratique l'utilisation de cpp . Mon système est ubuntu 16.04, j'utilise vscode comme éditeur. Me recommandez-vous d'utiliser votre -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualpendant que je compile avec g++ -std=c++11pendant que j'apprends le C ++ et la programmation? Ou devrais-je ignorer cette partie et commencer à utiliser les indicateurs de messages d'erreur plus tard? Si oui, quand dois-je commencer avec les messages d'erreur?
Scientific_explorer

2
@vkv: Je crois que le compilateur est vraiment votre ami, et vous devriez profiter de tous les petits conseils qu'il peut vous donner.
DevSolar


2

Ça enables most warning messages.

Vous pouvez en savoir plus si vous utilisez g++ --help=warnings.


0

Il active tous les avertissements. (se lit comme "Avertissement à tous")


Il y a en fait beaucoup d'avertissements qu'il n'active pas (comme le dtor non virtuel dans une classe avec des méthodes virtuelles).
Mark B

voir la réponse de Yuval: -Wallsignifie simplement "la plupart des avertissements" au lieu de "tous les avertissements".
HaxtraZ

-1

Il affiche tous les avertissements. Je recommanderais également d'utiliser -pedanticpour avertir de certaines parties de code non conformes.


Pour gcc doc: "Certains utilisateurs essaient d'utiliser -pedantic pour vérifier la stricte conformité des programmes à l'ISO C. Ils se rendent vite compte qu'il ne fait pas tout à fait ce qu'ils veulent: il trouve des pratiques non ISO, mais pas toutes - seulement celles pour lesquelles ISO C nécessite un diagnostic, et quelques autres pour lesquels des diagnostics ont été ajoutés. "
AProgrammer

Cela ne donne pas une garantie à 100%, mais cela aide.
Kirill V. Lyadvinsky

1
Si vous ne l' aviez pas écrit une au lieu de tous dans « pour mettre en garde toutes les parties non conformes », je ne l' aurais pas commenté. Mais votre formulation actuelle ne fait que répandre l'idée fausse contre laquelle la documentation gcc met en garde.
AProgrammer

Fixé. Mais dans la pratique, cela ressemble plutôt à un "plus de" et non à "certains".
Kirill V. Lyadvinsky
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.