Unterschied zwischen struct und typedef struct?



  • Hallo, ich bin mal wieder auf eine Frage gestoßen:

    (Ich würde das sowohl auf C als auch auf C++ bezogen wissen wollen)

    typedef wird doch normalerweise dazu benutzt, einen schon vorhandenen datentyp lediglich mit einem anderen wort zu verknüpfen, also z.B.

    typedef int ZAHL;
    

    Struct wird benutzt, um einen eigenen Datentyp zu erschaffen bzw. ein Record / Sammlung von mehreren Datentypen:

    struct kontakt {
    char name[20];
    int telnr;
    };
    

    Soweit ich das jetzt weiß, müsste ich, wenn ich jetzt eine Variable anlegen möchte vom Typ kontakt, dann müsste ich immer struct noch davor schreiben richtig?

    Ich hab jetzt gelesen, dass wenn ich folgendes schreibe:

    typedef struct {
    char name[20];
    int telnr;
    }KONTAKT;
    

    Dann brauch ich nur noch KONTAKT k1; schreiben?

    Dann ist aber meine Frage, warum schreib ich das Kontakt nicht oben hinter struct? Warum muss das unten beim Objektnamen hin?

    Geht das alles so in C/C++?



  • Auf C++ bezogen:

    Soweit ich das jetzt weiß, müsste ich, wenn ich jetzt eine Variable anlegen möchte vom Typ kontakt, dann müsste ich immer struct noch davor schreiben richtig?

    Nein. Du hast mit struct Xyz { ... }; den neuen Typen Xyz eingeführt und kannst davon Instanzen erstellen, wie von jedem anderen Typ. Also einfach Xyz a; .

    Du brauchst also in C++ die typedef struct Variante nicht mehr.



  • Auf C bezogen:

    Wenn du eine Struktur definierst, zum Beispiel struct xyz { ... }; kannst du eine Variable derer nicht über xyz instance; deklarieren, sondern musst struct xyz instance; schreiben.

    Manche Leute empfinden dieses wohlüberlegte Feature von C schlecht und bevorzugen das weglassen von struct . Über die gezeigte Verrenkung kann das erreicht werden.

    Besser ist übrigens folgende Syntax:

    typedef struct kontact { // ist kontact etwa ein Makro??? Nur dann schreibt man alles gross
      char *name;     // fixed-lenght ist out
      char *phone_nr; // Telefonnummern können mit 0 beginnen
    } kontact;
    

    Danach ist beides möglich, struct xyz a; und xyz b; . Die GLib macht das so.

    Noch als Vergleich die Implementation in C++:

    template <typename TString>
    class basic_contact {
    public:
      basic_contact(TString name, TString phone_nr) : name_(name), phone_nr_(phone_nr) {}
      const TString& name()     const { return name_;     }
      const TString& phone_nr() const { return phone_nr_; }
    private:
      TString name_;
      TString phone_nr_;
    };
    
    typedef basic_contact<std::string >  contact;
    typedef basic_contact<std::wstring> wcontact;
    


  • Alles klar, vielen Dank!



  • ... geht auch in kurz:

    #include<iostream>
    #include<string>
    using namespace std;
    typedef pair<string, string> kontakt;
    int main(){
      kontakt k1("maier", "01-0-345-678");
      cout << k1.first << k1.second; }
    


  • ... oder kürzer ohne typedef:

    #include<map>
    #include<string>
    using namespace std;
    int main(){
      map<string, string> kontakte;
      kontakte["meier"] = "543-210-67890"; }
    

Anmelden zum Antworten