typedef struct



  • Hallo,

    ich arbeite seit kurzem ein wenig mehr mit C und habe noch ein paar probleme, mit seinen Eigenheiten zurecht zu kommen. Da ich nicht immer 'struct xyz' als datentyp nutzen möchte, nutze ich dafür nun ein typedef. Nun sieht man allerdings zwei verschiedene arten, wie das realisiert wird:

    Named struct, typedef nach definition:

    struct xyz_struct {
      int x;
    };
    typedef struct xyz_struct xyz_t;
    

    Und typedef direkt ein struct ohne namen:

    typedef struct {
      int x;
    } xyz_t;
    

    Nun frage ich mich, gibt es dort unterschiede, vorteile/nachteile zwischen den beiden?


  • Mod

    Beim ersten gibt es den Typen struct xyz_struct plus die Alternativbezeichnung xyz_t (du könntest übrigens auch xyz_struct als Bezeichner benutzen, falls du das nicht wusstest. struct xyz_struct und xyz_struct sind für den Compiler zwei verschiedene Dinge). Beim zweiten gibt es nur den Typen xyz_t (und ein anonymes struct, das man nicht direkt ansprechen kann).

    Ich finde die erste Methode gut, wenn das struct Referenzen auf sich selber enthält, beispielsweise

    typedef struct list_element
    {
      int data;
      struct list_element *next;
    } list_element;
    

    Denn es bleibt einem kaum etwas anderes übrig.

    Wenn man so etwas nicht braucht, bietet sich die zweite Methode an, da sie nur eine einzelne Typenbezeichnung einführt (und ohne das mühselige struct ... am Anfang), was den Code, der das struct benutzt lesbar und einheitlich macht.



  • SeppJ schrieb:

    (du könntest übrigens auch xyz_struct als Bezeichner benutzen, falls du das nicht wusstest. struct xyz_struct und xyz_struct sind für den Compiler zwei verschiedene Dinge).

    Das wusste ich wirklich nicht, wollte es auch nicht unbedingt ausprobieren da ich unauffindbare Fehler vermeiden wollte.

    SeppJ schrieb:

    Ich finde die erste Methode gut, wenn das struct Referenzen auf sich selber enthält, beispielsweise

    typedef struct list_element
    {
      int data;
      struct list_element *next;
    } list_element;
    

    Denn es bleibt einem kaum etwas anderes übrig.

    Wenn man so etwas nicht braucht, bietet sich die zweite Methode an, da sie nur eine einzelne Typenbezeichnung einführt (und ohne das mühselige struct ... am Anfang), was den Code, der das struct benutzt lesbar und einheitlich macht.

    Ah, also kann ein anonymes struct (noch) nicht auf den typedef zugreifen, weil der erst 'danach' passiert? Gut zu wissen, bisher habe ich noch keine structs die Referenzen auf sich selbst enthält.


  • Mod

    tkausl schrieb:

    Ah, also kann ein anonymes struct (noch) nicht auf den typedef zugreifen, weil der erst 'danach' passiert?

    Genau.


Log in to reply