GCC Options · 5 min read · Jan 22, 2026

Opzioni della riga di comando GCC poco comuni ma utili - parte 2

Il compilatore gcc offre un elenco apparentemente infinito di opzioni della riga di comando. Naturalmente, nessuno utilizza o ha esperienza su tutte, ma ci sono un gruppo selezionato che ogni utente gcc dovrebbe - se non deve - conoscere. Mentre alcune di esse sono comunemente usate, altre sono un po’ insolite ma non meno utili.

In questa serie di articoli, ci concentriamo su alcune di queste opzioni della riga di comando gcc poco comuni ma utili, e abbiamo già trattato un paio di esse nella parte 1.

Se ricordi, all’inizio della prima parte di questa serie di tutorial, ho accennato brevemente all’opzione -Wall che gli sviluppatori generalmente usano per generare avvisi, ma non copre alcuni avvisi specifici. Se non sei a conoscenza di questi avvisi e non hai idea di come abilitarli, non preoccuparti, poiché spiegheremo tutto in dettaglio in questo articolo.

A parte questo, tratteremo anche un’opzione di avviso gcc relativa alle variabili in virgola mobile, così come come gestire meglio le opzioni della riga di comando gcc se l’elenco cresce.

Ma prima di procedere, ti prego di tenere a mente che tutti gli esempi, i comandi e le istruzioni menzionati in questo tutorial sono stati testati su Ubuntu 16.04 LTS, e la versione di gcc che abbiamo utilizzato è 5.4.0.

** Abilitare avvisi che non sono coperti da -Wall

Mentre l’opzione -Wall del compilatore gcc copre la maggior parte delle flag di avviso, ce ne sono alcune che rimangono disabilitate. Per abilitarle, usa l’opzione -Wextra.

Ad esempio, dai un’occhiata al seguente codice:

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

Ho accidentalmente messo un punto e virgola dopo la condizione ‘if’. Ora, quando il codice è stato compilato utilizzando il seguente comando gcc, non è stato prodotto alcun avviso.

gcc -Wall test.c -o test

Ma quando è stata utilizzata l’opzione -Wextra:

gcc -Wall -Wextra test.c -o test

È stato prodotto un avviso:

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

Come è chiaro dall’avviso mostrato sopra, l’opzione -Wextra ha abilitato internamente la flag -Wempty-body, che ha rilevato il codice sospetto e ha emesso l’avviso. Ecco l’elenco completo delle flag di avviso abilitate da questa opzione:

-Wclobbered, -Wempty-body, -Wignored-qualifiers, -Wmissing-field-initializers, -Wmissing-parameter-type (solo C), -Wold-style-declaration (solo C), -Woverride-init, -Wsign-compare, -Wtype-limits, -Wuninitialized, -Wunused-parameter (solo con -Wunused o -Wall), e -Wunused-but-set-parameter (solo con -Wunused o -Wall).

Se vuoi sapere cosa fanno le flag sopra menzionate, vai alla pagina man di gcc.

Procedendo, l’opzione -Wextra emette anche avvisi nei seguenti casi:

  • Un puntatore è confrontato con zero intero con <, <=, >, o >=
  • (solo C++) Un enumeratore e un non enumeratore appaiono entrambi in un’espressione condizionale.
  • (solo C++) Basi virtuali ambigue.
  • (solo C++) Sottoscrivere un array che è stato dichiarato register.
  • (solo C++) Prendere l’indirizzo di una variabile che è stata dichiarata register.
  • (solo C++) Una classe base non è inizializzata nel costruttore di copia di una classe derivata.

Abilitare avvisi per valori in virgola mobile nelle comparazioni di uguaglianza

Come già saprai, non si dovrebbe mai testare l’uguaglianza esatta dei valori in virgola mobile (non lo sapevi - leggi il FAQ relativo al confronto in virgola mobile qui). Ma anche se lo fai accidentalmente, il compilatore gcc genera qualche avviso o errore? Controlliamo:

Ecco un codice che confronta variabili in virgola mobile utilizzando l’operatore ==:

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

Ecco il comando gcc (contenente sia le opzioni -Wall che -Wextra) utilizzato per compilare questo codice:

gcc -Wall -Wextra test.c -o test

Sfortunatamente, il comando sopra non produce alcun avviso relativo al confronto in virgola mobile. Uno sguardo rapido alla pagina man di GCC rivela che esiste un’opzione dedicata -Wfloat-equal che dovrebbe essere utilizzata in questi scenari.

Ecco il comando contenente questa opzione:

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

Ecco l’output che ha prodotto:

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

Quindi, come puoi vedere nell’output sopra, l’opzione -Wfloat-equal ha costretto gcc a produrre un avviso relativo al confronto in virgola mobile.

Ecco cosa dice la pagina man di gcc su questa opzione:

L'idea alla base di questo è che a volte è conveniente (per il programmatore) considerare i valori in virgola mobile come approssimazioni a numeri reali infinitamente precisi. Se stai facendo questo, allora devi calcolare (analizzando il codice, o in qualche altro modo) l'errore massimo o probabile massimo che il calcolo introduce, e tenerne conto quando esegui confronti (e quando produci output, ma questo è un problema diverso). In particolare, invece di testare per l'uguaglianza, dovresti controllare se i due valori hanno intervalli che si sovrappongono; e questo viene fatto con gli operatori relazionali, quindi i confronti di uguaglianza sono probabilmente errati.

Come gestire meglio le opzioni della riga di comando gcc

Se l’elenco delle opzioni della riga di comando che stai utilizzando nel tuo comando gcc sta diventando più lungo e difficile da gestire, puoi metterlo in un file di testo e passare il nome di quel file come argomento al comando gcc. Per questo, dovrai usare l’opzione @file.

Ad esempio, se il tuo comando gcc è il seguente:

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

Allora puoi mettere le tre opzioni relative agli avvisi in un file chiamato, ad esempio, ‘gcc-options’:

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

E il tuo comando gcc diventa meno ingombro e facile da gestire:

gcc @gcc-options test.c -o test

Ecco cosa dice la pagina man di gcc su @file:

Leggi le opzioni della riga di comando dal file. Le opzioni lette vengono inserite al posto dell'opzione originale @file. Se il file non esiste, o non può essere letto, allora l'opzione sarà trattata letteralmente, e non rimossa.  

Le opzioni nel file sono separate da spazi bianchi. Un carattere di spazio bianco può essere incluso in un'opzione circondando l'intera opzione tra virgolette singole o doppie. Qualsiasi carattere (incluso un backslash) può essere incluso prefissando il carattere da includere con un backslash. Il file può contenere ulteriori opzioni @file; tali opzioni saranno elaborate ricorsivamente.

Conclusione

Quindi abbiamo coperto un totale di 5 opzioni della riga di comando gcc poco comuni ma utili in questa serie di tutorial: -save-temps, -g, -Wextra, -Wfloat-equal, e @file. Dedica del tempo a praticare ciascuna di esse e non dimenticare di esaminare tutti i dettagli che la pagina man di gcc offre su di esse.

Conosci o usi altre opzioni della riga di comando gcc utili e vuoi condividerle con il mondo? Lascia tutti i dettagli nei commenti qui sotto.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.