ANSI C konforme Initialisierung



  • 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.


  • Mod

    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.

    @camper:

    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.


Anmelden zum Antworten