Welche GCC-Optionen sollten gesetzt werden, damit GCC so streng wie möglich ist? (und ich meine so streng wie möglich) Ich schreibe in C89 und möchte, dass mein Code ANSI/ISO-konform ist.
Antworten
Zu viele Anzeigen?Ich würde die Verwendung empfehlen:
-Wall -Wextra -std=c89 -pedantic -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition
Sie sollten kompilieren mit -O
wie auch -g
da einige Warnungen nur verfügbar sind, wenn der Optimierer verwendet wird (tatsächlich verwende ich normalerweise -O3
für das Aufspüren der Probleme). Sie könnten bevorzugen -std=gnu89
da dadurch weniger Erweiterungen in den Bibliotheken deaktiviert werden. OTOH, wenn Sie zu strengen ANSI C89 kodieren, vielleicht möchten Sie sie deaktiviert. Die -ansi
Option ist gleichbedeutend mit -std=c89
aber nicht ganz so explizit und flexibel.
Der fehlende Prototyp warnt Sie vor Funktionen, die ohne Prototyp im Anwendungsbereich verwendet (oder externe Funktionen definiert) werden. Die strengen Prototypen bedeuten, dass Sie keine 'leeren Klammern' für Funktionsdeklarationen oder -definitionen (oder Funktionszeiger) verwenden können; Sie müssen entweder (void)
oder die richtige Argumentliste. Die Definition im alten Stil zeigt Funktionsdefinitionen im K&R-Stil, wie z. B.:
int old_style(a, b) int a; double b; { ... }
Wenn Sie Glück haben, müssen Sie sich darüber keine Sorgen machen. Bei meiner Arbeit habe ich nicht so viel Glück. Zu meinem Leidwesen kann ich keine strikten Prototypen verwenden, weil es zu viele schlampige Funktionszeiger gibt.
Siehe auch: Welches ist das beste Befehlszeilentool zum Bereinigen von Code?
Diese Reihe von Optionen ist ziemlich gut:
-Wall -Wextra -ansi -pedantic
Sie müssen die Dokumentation lesen, um zu sehen, ob es zusätzliche Warnungen gibt, die durch diese Kombination ausgelassen werden.
Sie sollten gewarnt sein, dass Strict C89 keine Unterstützung für //
Kommentare, und es gibt einige ernsthafte Beschränkungen für die Anzahl signifikanter Zeichen in den Namen von Objekten mit externer Verknüpfung.