Was macht "-Wall" in "g ++ -Wall test.cpp -o test"?

87

-o ändert den Ausgabedateinamen (ich habe festgestellt, dass --help verwendet wird)

Aber ich kann nicht herausfinden, was -Walltut?

Steven
quelle
7
"man gcc" auf Ihrer Konsole erzählt Ihnen alles über diese Flagge und eine einfache Google-Suche mit "gcc-Wall" auch ...
David Sauter
Lesen manSie als allgemeinen Tipp die Einträge für Programme, wenn Sie wissen möchten, was ein Switch tut oder welche Switches verfügbar sind. Die manSeite von gcckann auf linux.die.net/man/1/gcc gelesen werden - Sie können dort schnell nach dem Text "-Wall"
suchen
5
@ David Sauter, Google findet nichts mit "-wall". Es werden alle "Wände" von der Suche ausgeschlossen.
Kirill V. Lyadvinsky
@ Kirill Nicht, wenn Sie Anführungszeichen verwenden, wie ich
vermute,
1
// Ich dachte immer, es sei eine Hommage an Larry Wall.
Nathan Basanese

Antworten:

105

Es ist die Abkürzung für "warn all" - es aktiviert (fast) alle Warnungen, über die g ++ Sie informieren kann. In der Regel eine gute Idee, insbesondere wenn Sie Anfänger sind, da das Verstehen und Beheben dieser Warnungen Ihnen helfen kann, viele verschiedene Arten von Problemen in Ihrem Code zu beheben.

MatrixFrog
quelle
23
Weitere Warnungen (von denen einige sehr nützlich sind) können mit -Wextraund aktiviert werden -pedantic.
Gnud
7
Es ist nicht (fast) alles. Es ist eigentlich nur ein sehr kleiner Teil der verfügbaren Warnungen. Es sind diejenigen, über die sich "alle" einig sind. Die wirklich gute Idee ist , zu tun -Wall -Wextra, und dann peruse das Handbuch so viele zu finden mehr Warnungen Sie wie möglich ermöglichen könnten, denn auch -Wextranur eine kleine Teilmenge ist ...
DevSolar
@ DevSolar sehr guter Punkt. Wissen Sie, ob es eine Flagge gibt, die "buchstäblich alle Warnungen" bedeutet?
MatrixFrog
1
@MatrixFrog: Leider gibt es keine solche Option, zumindest nicht für die mir bekannten Compiler. Und die Liste der verfügbaren Warnungen ändert sich im Laufe der Zeit ... Wenn das GCC-Team vor -Wunreachable-codeeiniger Zeit nicht deaktiviert hätte, wäre Apple heutzutage viel glücklicher. ;-)
DevSolar
34

Siehe man gcc.

-Wall schaltet diese Warnungen ein:

-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 enthält:

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

Es gibt viele weitere Warnungen, die Sie explizit aktivieren müssen.

ZB für unseren C-Code verwenden wir:

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-optimierung -Wdiv-by-zero -Wendif-Labels -Wformat-extra-args -Wformat-nonliteral -Wformat-Sicherheit -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wjump-misses-init -Wlogical-op -Werror = fehlende Klammern -Wmissing-Deklarationen -Wno-fehlende-Format-Attribut -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-Makros -Wwrite-Strings -Wc ++ -compat -Werror = Deklaration-nach-Anweisung -Werror = implizite-Funktionsdeklaration -Wmissing-Prototypen -Werror = verschachtelte-externe Elemente -Werror = Definition im alten Stil -Werror = strenge Prototypen

oder nur die Warnungen mit https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html

rurban
quelle
19

Leider zitiert keine der Antworten den tatsächlich relevanten Teil des Handbuchs, was es wirklich auf den Punkt bringt:

Dies aktiviert alle Warnungen zu Konstruktionen, die einige Benutzer als fragwürdig erachten und die auch in Verbindung mit Makros leicht zu vermeiden (oder zu ändern, um die Warnung zu verhindern) sind.

[...]

Beachten Sie, dass einige Warnflags nicht von impliziert werden -Wall. Einige von ihnen warnen vor Konstruktionen, die Benutzer im Allgemeinen nicht als fragwürdig betrachten, die Sie jedoch gelegentlich überprüfen möchten. andere warnen vor Konstruktionen, die in einigen Fällen notwendig oder schwer zu vermeiden sind, und es gibt keine einfache Möglichkeit, den Code zu ändern, um die Warnung zu unterdrücken. Einige von ihnen werden von aktiviert, -Wextra aber viele von ihnen müssen einzeln aktiviert werden.

Ergo:

  • -Wallbedeutet nicht "alle Warnungen".
  • Es bedeutet auch nicht "(fast) alles", bei weitem nicht.
  • Es wird bedeuten , eine Reihe von einzelnen Optionen , die sich ändern wird , gebunden .

Unterm Strich handelt es sich um das absolute Minimum an Warnungen, die Sie festlegen sollten. Es -Wall -Wextraist zwar besser, nutzt aber immer noch nicht alle Fehler, die Ihr Compiler für Sie tun kann.


Persönlich würde ich nicht weniger als gehen -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual. Alle meine aktuellen Projekte verwenden tatsächlich eine längere Liste von Warnungen (ohne eine davon auszulösen). Und ich überprüfe das Handbuch bei jeder Hauptversion auf neue Optionen. Der Compiler ist dein Freund. Verwenden Sie die Diagnose, die es Ihnen bieten kann.

DevSolar
quelle
Ich habe angefangen, das Programmieren mit C ++ zu lernen. Ich benutze Programmierprinzipien und übe mit cpp . Mein System ist Ubuntu 16.04, ich benutze vscode als Editor. Empfehlen Sie mir, Ihre zu verwenden, -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualwährend ich kompiliere, g++ -std=c++11während ich C ++ und Programmieren lerne? Oder sollte ich diesen Teil überspringen und später Fehlermeldungen verwenden? Wenn ja, wann soll ich mit den Fehlermeldungen beginnen?
Scientific_Explorer
2
@vkv: Ich glaube, dass der Compiler wirklich dein Freund ist und du jeden kleinen Ratschlag nutzen solltest, den er dir geben kann.
DevSolar
6

Es ermöglicht Warnungen, die von gcc-Autoren an der Quelle als nützlich und leicht zu vermeiden erachtet werden . Es gibt auch -W (-Wextra in neueren Versionen), die als nützlich erachtet werden, für die das Umgehen von Fehlalarmen jedoch schwierig sein oder zu ungeschicktem Code führen kann.

gcc hat auch eine Reihe anderer Warnungen, die im Allgemeinen weniger nützlich sind. Siehe http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#Warning-Options

Ein Programmierer
quelle
2

Es enables most warning messages.

Sie können mehr herausfinden, wenn Sie verwenden g++ --help=warnings.

Yuval
quelle
-1

Es aktiviert alle Warnungen. (liest als "Warnung alle")

Björn J.
quelle
Es gibt tatsächlich viele Warnungen, die nicht aktiviert werden (z. B. nicht virtueller dtor in einer Klasse mit virtuellen Methoden).
Mark B
siehe Yuvals Antwort: -Wallbedeutet nur "die meisten Warnungen" anstelle von "alle Warnungen".
HaxtraZ
-1

Es werden alle Warnungen angezeigt. Ich würde auch empfehlen, -pedanticum vor nicht konformen Teilen des Codes zu warnen.

Kirill V. Lyadvinsky
quelle
Für gcc doc: "Einige Benutzer versuchen, -pedantic zu verwenden, um Programme auf strikte ISO C-Konformität zu überprüfen. Sie stellen bald fest, dass es nicht ganz das tut, was sie wollen: Es findet einige Nicht-ISO-Praktiken, aber nicht alle - nur diejenigen, für die ISO C erfordert eine Diagnose und einige andere, für die eine Diagnose hinzugefügt wurde. "
AProgrammer
Es gibt keine 100% ige Garantie, aber es hilft.
Kirill V. Lyadvinsky
1
Wenn Sie nicht einige statt alle in "um vor allen nicht konformen Teilen zu warnen " geschrieben hätten, hätte ich nicht kommentiert. Ihre aktuelle Formulierung verbreitet jedoch nur das Missverständnis, vor dem die gcc-Dokumentation warnt.
AProgrammer
Fest. Aber in der Praxis sieht es eher nach "den meisten" und nicht nach "einigen" aus.
Kirill V. Lyadvinsky