Dies ist sowohl eine Antwort als auch ein erweiterter Kommentar zu Nein, dies ist seit 1999 kein legales C mehr. Kein anständiger moderner C-Compiler erlaubt dies.
Ja, auto a=1;
ist in C1999 (und auch in C2011) illegal. Nur weil dies jetzt illegal ist, bedeutet dies nicht, dass ein moderner C-Compiler Code ablehnen sollte, der solche Konstrukte enthält. Ich würde genau das Gegenteil argumentieren, dass ein anständiger moderner C-Compiler dies noch berücksichtigen muss.
Sowohl clang als auch gcc tun genau das, wenn sie den Beispielcode in der Frage mit den Versionen des Standards von 1999 oder 2011 kompilieren. Beide Compiler geben eine Diagnose aus und fahren dann fort, als ob die anstößige Aussage gewesen wäre auto int a=1;
.
Meiner Meinung nach sollte ein anständiger Compiler dies tun. Durch die Ausgabe einer Diagnose entsprechen clang und gcc vollständig dem Standard. Der Standard besagt nicht, dass ein Compiler illegalen Code ablehnen muss. Der Standard besagt lediglich, dass eine konforme Implementierung mindestens eine Diagnosemeldung erzeugen muss, wenn eine Übersetzungseinheit eine Verletzung einer Syntaxregel oder -beschränkung enthält (5.1.1.3).
Bei Code, der unzulässige Konstrukte enthält, versucht jeder anständige Compiler, den unzulässigen Code zu verstehen, damit der Compiler den nächsten Fehler im Code finden kann. Ein Compiler, der beim ersten Fehler stoppt, ist kein sehr guter Compiler. Es gibt eine Möglichkeit, einen Sinn daraus zu machen auto a=1
, nämlich die "implizite int" -Regel anzuwenden. Diese Regel zwingt den Compiler, so zu interpretieren, auto a=1
als ob auto int a=1
der Compiler im C90- oder K & R-Modus verwendet würde.
Die meisten Compiler lehnen normalerweise Code ab (ablehnen: Verweigern der Generierung einer Objektdatei oder einer ausführbaren Datei), der eine unzulässige Syntax enthält. Dies ist ein Fall, in dem die Compilerautoren entschieden haben, dass ein fehlgeschlagenes Kompilieren nicht die beste Option ist. Am besten stellen Sie eine Diagnose, korrigieren den Code und fahren fort. Es gibt einfach zu viel Legacy-Code, der mit Konstrukten wie gespickt ist register a=1;
. Der Compiler sollte in der Lage sein, diesen Code im C99- oder C11-Modus zu kompilieren (natürlich mit einer Diagnose).
int
wurde 1999 aus dem C-Standard entfernt.