Struct-Initialisierung



  • Ich schreibe gerade einen Parser für ANSI C, dabei ist mir dieses Problem untergekommen:

    Wieso ist dieser Code hier legal - wirft keine Fehlermeldung (Warnungen, aber die sind egal)? Hat das ".y.z" einen tieferen Sinn? Bzw. ist da ein Unterschied zu einem einfachen ".z"?

    struct {int x; int y[4]; int z;} a = { 1, .y.z = 5, 3 };
    

    Ich hätte erwartet, dass dafür sowas erlaubt ist (was aber offenbar nicht geht):

    struct {int x; int y[4]; int z;} a = { 1, .y[3] = 5, 3 };
    


  • Ok, hatte einen zu alten Compiler erwischt... der aktuelle GCC erkennt das.



  • Also bei mir ist der Code weder mit GCC, GPP, noch in VCPP und im good old Borland schon gar nicht gültig (legal)!

    Was hast du den für einen Compiler?
    Schon mal versucht mit dem Debugger herauszufinden wie der Inhalt von a aussieht?

    upps da warst wohl schon schneller als ich!!



  • Das zweite geht seit C99 (was der gcc fast komplett umsetzt), beim ersten wundert es mich doch auch, dass das keinen Fehler gibt 😕



  • Nunja, das hier...

    int main(){
        struct {int x; int y; int z;} a = { 1, .y.z = 5 };
    
        printf( "%d %d %d\n", a.x, a.y, a.z );
    }
    

    ... gibt mit dem alten Compiler einfach "1 0 5" aus. Dürfte jetzt wohl klar sein wie einfach die Programmierer es sich gemacht haben 😉 (Das war übrigens Dev-C++ 4, keine Ahnung was die dahinter verwenden)


Anmelden zum Antworten