GCC Optionen · 5 min read · Jan 22, 2026

Ungewöhnliche, aber nützliche GCC-Befehlszeilenoptionen - Teil 2

Der gcc-Compiler bietet eine scheinbar endlose Liste von Befehlszeilenoptionen. Natürlich verwendet niemand alle oder hat Expertise in allen, aber es gibt eine ausgewählte Gruppe, die jeder gcc-Nutzer wissen sollte - wenn nicht sogar wissen muss. Während einige von ihnen häufig verwendet werden, sind andere etwas ungewöhnlich, aber nicht weniger nützlich.

In dieser Artikelreihe konzentrieren wir uns auf einige dieser ungewöhnlichen, aber nützlichen gcc-Befehlszeilenoptionen und haben bereits einige davon im Teil 1 behandelt.

Wenn Sie sich erinnern, habe ich zu Beginn des ersten Teils dieser Tutorialreihe kurz erwähnt, dass die -Wall-Option, die Entwickler normalerweise zur Generierung von Warnungen verwenden, einige spezifische Warnungen nicht abdeckt. Wenn Sie sich dieser Warnungen nicht bewusst sind und keine Ahnung haben, wie Sie sie aktivieren können, machen Sie sich keine Sorgen, denn wir werden all das in diesem Artikel im Detail erklären.

Neben diesem Thema werden wir auch eine gcc-Warnungsoption im Zusammenhang mit Gleitkomma-Variablen behandeln sowie, wie man die gcc-Befehlszeilenoptionen besser verwalten kann, wenn die Liste groß wird.

Aber bevor wir fortfahren, beachten Sie bitte, dass alle Beispiele, Befehle und Anweisungen, die in diesem Tutorial erwähnt werden, auf Ubuntu 16.04 LTS getestet wurden und die verwendete gcc-Version 5.4.0 ist.

** Aktivieren Sie Warnungen, die nicht von -Wall abgedeckt sind

Während die -Wall-Option des gcc-Compilers die meisten Warnungsflags abdeckt, gibt es einige, die deaktiviert bleiben. Um sie zu aktivieren, verwenden Sie die -Wextra-Option.

Zum Beispiel, werfen Sie einen Blick auf den folgenden Code:

#include   
#include   
int main()  
{  
    int i=0;  
    /* ...  
       some code here   
       ...  
    */  
      
    if(i);  
        return 1;  
     return 0;   
}

Ich habe versehentlich ein Semikolon nach der ‘if’-Bedingung gesetzt. Jetzt, als der Code mit dem folgenden gcc-Befehl kompiliert wurde, wurde keine Warnung ausgegeben.

gcc -Wall test.c -o test

Aber als die -Wextra-Option verwendet wurde:

gcc -Wall -Wextra test.c -o test

Wurde eine Warnung ausgegeben:

test.c: In function ‘main’:  
test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]  
 if(i);

Wie aus der oben gezeigten Warnung ersichtlich, hat die -Wextra-Option intern das -Wempty-body-Flag aktiviert, das den verdächtigen Code erkannt und die Warnung ausgegeben hat. Hier ist die vollständige Liste der Warnungsflags, die durch diese Option aktiviert werden:

-Wclobbered, -Wempty-body, -Wignored-qualifiers, -Wmissing-field-initializers, -Wmissing-parameter-type (nur C), -Wold-style-declaration (nur C), -Woverride-init, -Wsign-compare, -Wtype-limits, -Wuninitialized, -Wunused-parameter (nur mit -Wunused oder -Wall) und -Wunused-but-set-parameter (nur mit -Wunused oder -Wall).

Wenn Sie erfahren möchten, was die oben genannten Flags tun, gehen Sie zur Man-Seite von gcc.

Weiter geht’s, die -Wextra-Option gibt auch Warnungen in den folgenden Fällen aus:

  • Ein Zeiger wird mit <, <=, > oder >= mit der Ganzzahl Null verglichen
  • (nur C++) Ein Enumerator und ein Nicht-Enumerator erscheinen beide in einem
    bedingten Ausdruck.
  • (nur C++) Mehrdeutige virtuelle Basen.
  • (nur C++) Indizierung eines Arrays, das als
    register deklariert wurde.
  • (nur C++) Die Adresse einer Variablen, die als
    register deklariert wurde, wird genommen.
  • (nur C++) Eine Basisklasse wird im Kopierkonstruktor einer abgeleiteten Klasse nicht initialisiert.

Aktivieren Sie Warnungen für Gleitkommawerte in Gleichheitsvergleichen

Wie Sie vielleicht bereits wissen, sollte man niemals die exakte Gleichheit von Gleitkommawerten testen (wenn Sie das nicht wussten - lesen Sie die FAQ zu Gleitkomma-Vergleichen hier). Aber selbst wenn Sie dies versehentlich tun, wirft der gcc-Compiler eine Warnung oder einen Fehler aus? Lassen Sie es uns überprüfen:

Hier ist ein Code, der Gleitkomma-Variablen mit dem ==-Operator vergleicht:

#include  
  
void compare(float x, float y)  
{  
    if(x == y)  
    {  
        printf("\n EQUAL \n");  
    }  
}  
  
int main(void)  
{  
    compare(1.234, 1.56789);  
   
    return 0;   
}

Und hier ist der gcc-Befehl (der sowohl -Wall als auch -Wextra-Optionen enthält), der verwendet wurde, um diesen Code zu kompilieren:

gcc -Wall -Wextra test.c -o test

Leider produziert der obige Befehl keine Warnung im Zusammenhang mit dem Gleitkommavergleich. Ein schneller Blick auf die Man-Seite von GCC zeigt, dass es eine spezielle Option -Wfloat-equal gibt, die in diesen Szenarien verwendet werden sollte.

Hier ist der Befehl, der diese Option enthält:

gcc -Wall -Wextra -Wfloat-equal test.c -o test

Und folgendes ist die Ausgabe, die er produziert hat:

test.c: In function ‘compare’:  
test.c:5:10: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]  
 if(x == y)

Wie Sie in der obigen Ausgabe sehen können, zwang die -Wfloat-equal-Option gcc, eine Warnung im Zusammenhang mit dem Gleitkommavergleich auszugeben.

Hier ist, was die Man-Seite von gcc über diese Option sagt:

Die Idee dahinter ist, dass es manchmal für den Programmierer praktisch ist, Gleitkommawerte als Annäherungen an unendlich präzise reelle Zahlen zu betrachten. Wenn Sie dies tun, müssen Sie (durch Analyse des Codes oder auf andere Weise) den maximalen oder wahrscheinlich maximalen Fehler berechnen, den die Berechnung einführt, und dies bei Vergleichen (und bei der Ausgabe, aber das ist ein anderes Problem) berücksichtigen. Insbesondere sollten Sie anstelle von Gleichheit überprüfen, ob die beiden Werte überlappende Bereiche haben; und dies geschieht mit den relationalen Operatoren, sodass Gleichheitsvergleiche wahrscheinlich fehlerhaft sind.

Wie man gcc-Befehlszeilenoptionen besser verwaltet

Wenn die Liste der Befehlszeilenoptionen, die Sie in Ihrem gcc-Befehl verwenden, größer wird und schwer zu verwalten ist, können Sie sie in einer Textdatei speichern und den Namen dieser Datei als Argument an den gcc-Befehl übergeben. Dazu müssen Sie die @file-Befehlszeilenoption verwenden.

Wenn Ihr gcc-Befehl beispielsweise folgendermaßen aussieht:

gcc -Wall -Wextra -Wfloat-equal test.c -o test

Dann können Sie die drei warnungsbezogenen Optionen in einer Datei mit dem Namen ‘gcc-options’ speichern:

$ cat gcc-options   
-Wall -Wextra -Wfloat-equal

Und Ihr gcc-Befehl wird weniger unübersichtlich und einfacher zu verwalten:

gcc @gcc-options test.c -o test

Hier ist, was die Man-Seite von gcc über @file sagt:

Befehlszeilenoptionen aus der Datei lesen. Die gelesenen Optionen werden anstelle der ursprünglichen @file-Option eingefügt. Wenn die Datei nicht existiert oder nicht gelesen werden kann, wird die Option wörtlich behandelt und nicht entfernt.  

Optionen in der Datei sind durch Leerzeichen getrennt. Ein Leerzeichen kann in einer Option enthalten sein, indem die gesamte Option entweder in einfache oder doppelte Anführungszeichen gesetzt wird. Jedes Zeichen (einschließlich eines Backslashes) kann enthalten werden, indem das einzuschließende Zeichen mit einem Backslash vorangestellt wird. Die Datei kann selbst zusätzliche @file-Optionen enthalten; solche Optionen werden rekursiv verarbeitet.

Fazit

Wir haben in dieser Tutorialreihe insgesamt 5 ungewöhnliche, aber nützliche gcc-Befehlszeilenoptionen behandelt: -save-temps, -g, -Wextra, -Wfloat-equal und @file. Nehmen Sie sich Zeit, um jede von ihnen zu üben, und vergessen Sie nicht, alle Details zu lesen, die die Man-Seite von gcc über sie bietet.

Kennen Sie andere nützliche gcc-Befehlszeilenoptionen und möchten Sie diese mit der Welt teilen? Hinterlassen Sie alle Details in den Kommentaren unten.

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.