-ansi
ist ein veralteter Schalter, der den Compiler zu kompilieren , nach dem 30-jährigen fordert veraltete Version von C - Norm , ISO / IEC 9899: 1990 , die im Wesentlichen ein Rebranding der ANSI - Standard „Programmiersprache C C3.159-1989 . Warum veraltet? Denn nachdem C90 von ISO veröffentlicht wurde, war ISO für die C-Normung verantwortlich, und alle technischen Berichtigungen zu C90 wurden von ISO veröffentlicht -std=c90
.
Ohne diesen Schalter entsprechen die aktuellen GCC C-Compiler der in ISO / IEC 9899: 2011 standardisierten C-Sprache oder der neuesten Version von 2018.
Leider gibt es einige faule Compiler-Anbieter, die glauben, dass es akzeptabel ist, sich an eine ältere veraltete Standardrevision zu halten, für die das Standardisierungsdokument nicht einmal von Standardgremien erhältlich ist.
Durch die Verwendung des Schalters können Sie sicherstellen, dass der Code in diesen veralteten Compilern kompiliert wird.
Das -pedantic
ist interessant. In Abwesenheit von -pedantic
selbst , wenn ein bestimmten Standard angefordert wird, wird GCC noch einigen Erweiterungen erlauben , die nicht akzeptabel in der C - Norm. Betrachten Sie zum Beispiel das Programm
struct test {
int zero_size_array[0];
};
Der C11-Entwurf n1570 Absatz 6.7.6.2p1 lautet :
Zusätzlich zu optionalen Typqualifizierern und dem Schlüsselwort static können [und] einen Ausdruck oder * begrenzen. Wenn sie einen Ausdruck begrenzen (der die Größe eines Arrays angibt), muss der Ausdruck einen ganzzahligen Typ haben. Wenn der Ausdruck ein konstanter Ausdruck ist, muss er einen Wert größer als Null haben. [...]
Der C-Standard verlangt, dass die Array-Länge größer als Null ist. und dieser Absatz ist in den Einschränkungen ; Der Standard besagt Folgendes 5.1.1.3p1 :
Eine konforme Implementierung muss mindestens eine Diagnosemeldung (auf implementierungsdefinierte Weise identifiziert) erzeugen, wenn eine vorverarbeitende Übersetzungseinheit oder Übersetzungseinheit eine Verletzung einer Syntaxregel oder -beschränkung enthält, selbst wenn das Verhalten auch explizit als undefiniert oder Implementierung angegeben ist. definiert. Unter anderen Umständen müssen keine Diagnosemeldungen erstellt werden.9)
Wenn Sie das Programm jedoch mit kompilieren gcc -c -std=c90 pedantic_test.c
, wird keine Warnung ausgegeben.
-pedantic
bewirkt, dass der Compiler tatsächlich dem C-Standard entspricht ; Jetzt wird eine Diagnosemeldung ausgegeben, wie dies vom Standard gefordert wird:
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];
^~~~~~~~~~~~~~~
Für eine maximale Portabilität reicht es daher nicht aus, die Standardrevision anzugeben. Sie müssen auch -pedantic
(oder -pedantic-errors
) verwenden, um sicherzustellen, dass GCC tatsächlich dem Buchstaben des Standards entspricht.
Der letzte Teil der Frage betraf die Verwendung -ansi
mit C ++ . ANSI hat die C ++ - Sprache nie standardisiert - nur von ISO übernommen. Dies ist ungefähr so sinnvoll wie die Aussage "Englisch wie von Frankreich standardisiert". GCC scheint es jedoch immer noch für C ++ zu akzeptieren, so dumm es auch klingt.