31 Stimmen

GCC-Optionen für strengsten C-Code?

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.

30voto

Jonathan Leffler Punkte 694013

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?

9voto

Carl Norum Punkte 210051

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X