Frage zum C Standard: typedef auf nicht vollständigen Typ



  • Hallo zusammen,

    wir haben gerade eine kleine Diskussion über typedefs auf nicht vollständige Typen.

    Ist folgendes nach Standard erlaubt?

    struct S_Blah;
    typedef S_Blah S_Blah_t;
    
    // S_Blah_t* verwenden beispielsweise in Funktionsdefinitionen
    // viele viele Zeilen
    
    struct S_Blah
    {
       // ...
    };
    

    Wir sind uns nicht einig...

    Danke für die Hilfe

    Gruß
    Tobi



  • Ich finde im Standard nichts, was dagegen spricht. Warum soll das denn nicht gehen?



  • Solche typedefs funktionieren nur mit:

    typedef struct S_Blah S_Blah_t;
    

    Andernfalls meckert der Parser, da er S_Blah nicht kennt.


  • Mod

    Nirvash schrieb:

    Solche typedefs funktionieren nur mit:

    typedef struct S_Blah S_Blah_t;
    

    Andernfalls meckert der Parser, da er S_Blah nicht kennt.

    Vermutlich wieder ein C++-Compiler, der für C missbraucht wird.



  • SeppJ schrieb:

    Vermutlich wieder ein C++-Compiler, der für C missbraucht wird.

    Mag ja angenehm sein, solchen Code zu schreiben, doch letztendlich geht mir damit doch auch ein Stück Übersicht verloren, welchen Typ ich mit typedef vereinfache.

    Wenn an dieser Stelle ein C++-Compiler für C benutzt wird, lässt sich auch die Frage nach der Standard-Kompaitiblität mit nein beantworten. der C89-Standard unterstützt dies definitiv nicht! Mit C99 arbeite ich persönlich nicht, aber auch da würde ich dies mit nein beantworten. SeppJs Aussage zu folge ist dieses Verhalten nicht C konform.



  • Sehr wahrscheinlich die "Typsicherheit" aus C++, die sowas zulässt.

    #ifdef __cplusplus
    #error C++
    #else
    #error C
    #endif
    

    sollte das aufklären.



  • Der genaue Fall wird im Standard in einer Fußnote behandelt:

    ISO/IEC 9899:1999 6.7.2.3 (3) (Fußnote 109) schrieb:

    1. An incomplete type may only be used when the size of an object of that type is not needed. It is not needed, for example, when a typedef name is declared to be a specifier for a structure or union, or when a pointer to or a function returning a structure or union is being declared. (See incomplete types in 6.2.5.) The specification has to be complete before such a function is called or defined.

    Also: ist erlaubt.



  • Die Frage war nach typedefs auf unvollständige Typen, und die Antwort ist in C und C++ gleich, nicht ob man das struct weglassen kann 🙄



  • SeppJ schrieb:

    Nirvash schrieb:

    Solche typedefs funktionieren nur mit:

    typedef struct S_Blah S_Blah_t;
    

    Andernfalls meckert der Parser, da er S_Blah nicht kennt.

    Vermutlich wieder ein C++-Compiler, der für C missbraucht wird.

    In diesem Fall nicht. Ich habe gegen die Regel verstoßen den Code zu kopieren anstatt einfach was abzuschreiben oder genauer gesagt aus dem Kopf hinzuschreiben... Tut mir leid, dafür entschuldige ich mich...

    seldon schrieb:

    Der genaue Fall wird im Standard in einer Fußnote behandelt:

    ISO/IEC 9899:1999 6.7.2.3 (3) (Fußnote 109) schrieb:

    1. An incomplete type may only be used when the size of an object of that type is not needed. It is not needed, for example, when a typedef name is declared to be a specifier for a structure or union, or when a pointer to or a function returning a structure or union is being declared. (See incomplete types in 6.2.5.) The specification has to be complete before such a function is called or defined.

    Also: ist erlaubt.

    Genau diese Antwort habe ich gesucht und nicht gefunden. Herzlichen Dank dafür 👍

    @all
    Danke für die Antworten, ihr wart wie immer eine schnelle und gute Hilfe. Danke dafür 👍

    Gruß
    Tobi


Anmelden zum Antworten