ANSI C konforme Initialisierung
-
Danke, aber ich hatte ja mehrfach erwähnt, dass ich von ANSI C, also C89 und nicht C99 spreche. Wie sieht es denn dort aus?
-
C99 ist auch ANSI-C, aber davon mal abgesehen: Was lässt dich glauben, dass es damals anders war? Der C89-Standard ist leider recht schwer aufzutreiben heutzutage ... meines Wissens gehören diese Dinge aber nicht zu denen, die sich mit C99 geändert haben.
-
Hö, ich dachte die ANSI hatte damals nur C89 standardisiert und der Rest wurde nur von der ISO standardisiert. Hab mich gerade schlau gemacht ... damit lieg ich ja mal voll daneben. Sorry.
Egal. Ich bin mir eigentlich recht sicher, dass in C89 alle Deklarationen vor der ersten ausführbaren Zeile stehen müssen. Sollte das stimmen, wäre das nicht mehr valide:
void foobar() { int a = globalVar; int b; while(...) ... }
Und ich würde jetzt mal behaupten, dass der gcc mit -ansi (entspricht -std=c89) und -pedantic hier auch einen Fehler ausgeben wird. Nur leider hab ich gerade keine Linux-Box zum Testen zur Hand.
-
Also bei mir gibt er keinen Fehler aus
Ergänzung: bei keinem von deine Beispielen s.u.
-
Es müssen in C89 alle Deklarationen vor allen Anweisungen stehen. Das ist im Ausgangsbeispiel gegeben, da dort keine Anweisungen enthalten sind. "Ausführbare" Deklarationen sind dagegen kein Problem. Das ist etwas schizophren, vielleicht hat man es auch deshalb geändert.
-
Also ich hab jetzt nochmal eine Weile gesucht. Und es scheint mir wirklich etwas schizophren, dass folgendes erlaubt ist:
void foobar() { int a = (globalVar ? 1 : 0); int b; while(...) ... }
aber das folgende nicht:
void foobar() { int a; a = (globalVar ? 1 : 0); int b; while(...) ... }
Könnt ihr das so bestätigen?
-
Das
a = (globalVar ? 1 : 0);
im 2. Beispiel ist Code und der muss in C89 nach den Variablendefinitionen stehen.
Ab C99 kann Code und Variabledefinition gemischt werden.
-
Ok danke, ich hab außerdem eine ähnliche Diskussion hier gefunden.
-
Bashar schrieb:
C99 ist auch ANSI-C, aber davon mal abgesehen:
Randmeinung, ANSI (nationales Institut) spezifizierte einen Standard 1989 (C89), der wurde 1990 von ISO (internationales Institut) "adopted" -> ISO C90.
ISO spezifizierte einen weiteren Standard 1999 (C99), der wurde 2000 von ANSI "backadopted".
Ganz überwiegend wird ANSI C mit C89 gleichgesetzt (wie auch C90 mit C89), siehe auch entsprechende gcc Option -ansi ( ist hier äquivalent zu -std=c89 ).
-
Wutz schrieb:
Ganz überwiegend wird ANSI C mit C89 gleichgesetzt
Ganz Du die Behauptung irgendwie belegen? Ich hätte spontan unter ANSI C "den" Standard (also den aktuellen) verstanden. Und damit scheine ich ja nicht der einzige zu sein.
siehe auch entsprechende gcc Option -ansi ( ist hier äquivalent zu -std=c89 ).
Das ist wohl eher der Abwärtskompatibilität geschuldet.
-
Wutz schrieb:
ISO spezifizierte einen weiteren Standard 1999 (C99), der wurde 2000 von ANSI "backadopted".
Mit anderen Worten, der gültige ANSI-Standard ist C99.
-
Tobiii schrieb:
Also ich hab jetzt nochmal eine Weile gesucht. Und es scheint mir wirklich etwas schizophren, dass folgendes erlaubt ist:
void foobar() { int a = (globalVar ? 1 : 0); int b; while(...) ... }
aber das folgende nicht:
void foobar() { int a; a = (globalVar ? 1 : 0); int b; while(...) ... }
Könnt ihr das so bestätigen?
Diese Restriktion in C90 ist rein grammatikalisch bedingt:
(6.6.2) compound-statement { declaration-list[t]opt[/t] statement-list[t]opt[/t] }
das ist ein Erbe aus K&R-Zeiten, weil es den Parser geringfügig vereinfacht.
In C99 sieht es dann so aus
(6.8.2) compound-statement: { block-item-list[t]opt[/t] } (6.8.2) block-item-list: block-item block-item-list block-item (6.8.2) block-item: declaration statement
-
Bin grad zufällig über meinen alten Beitrag gestolpert.
Danke für die Klarstellung, dass macht die Limitierung wesentlich einfacher zu verstehen.
@Wutz & SG1:
Ich hatte bisher auch ANSI mit C89 gleichgesetzt, aber vor allem weil ich meistens mit dem GCC arbeite und dort eben -ansi äquivalent zu -std=c89 ist.
-
Tobiii schrieb:
Ich hatte bisher auch ANSI mit C89 gleichgesetzt, aber vor allem weil ich meistens mit dem GCC arbeite und dort eben -ansi äquivalent zu -std=c89 ist.
Das wird daran liegen, das der Switch -ansi mit C89 eingeführt wurde und sich die Bedeutung nicht mehr geändert hat.