-ansi
è un interruttore obsoleta che richiede il compilatore per compilare secondo il 30-year-old revisione obsoleta di standard C , ISO / IEC 9899: 1990 , che è essenzialmente un rebranding del standard ANSI X3.159-1989 "linguaggio di programmazione C . Perché obsoleto? Perché dopo che C90 è stato pubblicato da ISO, ISO è stato responsabile della standardizzazione C, e ogni correzione tecnica a C90 è stata pubblicata da ISO, quindi è più appropriato usare il file -std=c90
.
Senza questo interruttore, i recenti compilatori GCC C saranno conformi al linguaggio C standardizzato in ISO / IEC 9899: 2011 o alla più recente revisione 2018.
Sfortunatamente ci sono alcuni venditori di compilatori pigri che credono che sia accettabile attenersi a una vecchia revisione standard obsoleta, per la quale il documento di standardizzazione non è nemmeno disponibile presso gli organismi standard.
L'uso dello switch aiuta a garantire la compilazione del codice in questi compilatori obsoleti.
È -pedantic
interessante. In assenza di -pedantic
, anche quando viene richiesto uno standard specifico, GCC consentirà comunque alcune estensioni non accettabili nello standard C. Considera ad esempio il programma
struct test {
int zero_size_array[0];
};
Il progetto C11 n1570 paragrafo 6.7.6.2p1 dice :
Oltre ai qualificatori di tipo opzionali e alla parola chiave static, il simbolo [e] può delimitare un'espressione o *. Se delimitano un'espressione (che specifica la dimensione di un array), l'espressione deve avere un tipo intero. Se l'espressione è un'espressione costante, deve avere un valore maggiore di zero. [...]
Lo standard C richiede che la lunghezza dell'array sia maggiore di zero; e questo paragrafo è nei vincoli ; lo standard dice il seguente 5.1.1.3p1 :
Un'implementazione conforme produce almeno un messaggio diagnostico (identificato in modo definito dall'implementazione) se un'unità di traduzione preelaborata o un'unità di traduzione contiene una violazione di qualsiasi regola o vincolo di sintassi, anche se il comportamento è anche esplicitamente specificato come non definito o implementazione- definito. I messaggi diagnostici non devono essere prodotti in altre circostanze.9)
Tuttavia, se si compila il programma con gcc -c -std=c90 pedantic_test.c
, non viene prodotto alcun avviso.
-pedantic
fa sì che il compilatore sia effettivamente conforme allo standard C ; così ora produrrà un messaggio diagnostico, come richiesto dallo standard:
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
int zero_size_array[0];
^~~~~~~~~~~~~~~
Pertanto, per la massima portabilità, specificare la revisione standard non è sufficiente, è inoltre necessario utilizzare -pedantic
(o -pedantic-errors
) per assicurarsi che GCC sia effettivamente conforme alla lettera dello standard.
L'ultima parte della domanda riguardava l'utilizzo -ansi
con C ++ . ANSI non ha mai standardizzato il linguaggio C ++ - adottandolo solo dall'ISO, quindi ha senso tanto quanto dire "inglese come standardizzato dalla Francia". Comunque GCC sembra ancora accettarlo per C ++, per quanto stupido sembri.