einige syntaxfragen (typedef, struct)



  • hi!
    ich hab einige verständnissfragen zur syntax einer sdk, die ich gerade versuche zu verstehen.

    ein codefragment was da vorkommt geht etwa so:

    typedef struct DriverInfo
    {
    	typ1 bla;
    	typ2 blub;
    	...
    }DriverInfo;
    

    warum steht das der Name DriverInfo sowohl nach dem struct als auch am ende der struct-definition?
    hat das irgendeinen tieferen sinn?
    und aus dem typedef werd ich auch nicht so richtig schlau. warum typedeffen die das? was bewirkt das typedef davor genau?



  • Das ist C.

    Da musste man noch "struct Foo variable" schreiben, um Variablen anzulegen, etc. Deswegen hat ma oft getypedeft, um das ganze so wie normale Typen verwenden zu können, also wie du es gewohnt bist "Foo variable".
    In C++ ist es sinnlos



  • Ach so!
    na das erklärt warum mir der code manchmal so merkwürdig vorkommt! c kenn ich nicht!
    eigentlich ist das ja ne c++ sdk.
    naja, wie auch immer, danach kommt noch ein stück code das ich nicht verstehe:

    DriverInfo asioDriverInfo = {0};
    

    was soll das {0}? ein einelementiges array? wo sind dann die eckigen klammern?? 😕



  • prokaion schrieb:

    Ach so!
    na das erklärt warum mir der code manchmal so merkwürdig vorkommt! c kenn ich nicht!
    eigentlich ist das ja ne c++ sdk.
    naja, wie auch immer, danach kommt noch ein stück code das ich nicht verstehe:

    DriverInfo asioDriverInfo = {0};
    

    was soll das {0}? ein einelementiges array? wo sind dann die eckigen klammern?? 😕

    Eine neue Instanz names asioDriverInfo wird erstellt und der Kopierkonstruktor aufgerufen. Könnte man auch so schreiben:

    DriverInfo asioDriverInfo({0});
    

    mfg.



  • ok, verstehe, aber so einen initialisierungsparameter hab ich noch nie gesehen: "{0}" .
    eigentlich gibts ja keinen ctor der irgendeinen parameter verlangt...

    warum reicht nicht das übliche

    DriverInfo asioDriverInfo;
    

    ?
    was bedeutet {0} ???
    mfg



  • prokaion schrieb:

    eigentlich gibts ja keinen ctor der irgendeinen parameter verlangt...

    Exakt, deshalb ist das, was joomoo geschrieben hat, auch Unsinn.

    DriverInfo asioDriverInfo = {0};
    

    In den geschweiften Klammern wird einfach die Initialisierung durchgeführt. Dh, du kannst jeden Member damit explizit initialisieren. Das funktioniert aber nur, sofern du keinen ctor deklariert hast. Alle Member, für die nichts angegeben wurde, werden nullinitialisiert. Und genau das wird bei deinem Beispiel auch gemacht. Genau genommen würde sogar schon

    DriverInfo asioDriverInfo = {};
    

    reichen.



  • cool!
    sowas hab ich schon fast geahnt...
    damit kann man also alle member mit 0 initialisieren!

    werden die member wirklich auch mit 0 initialisiert, wenn man
    DriverInfo asioDriverInfo = {}; schreiben würde?

    danke! hab ich noch nie von gehört!

    danke an alle für die antworten! 🙂



  • prokaion schrieb:

    werden die member wirklich auch mit 0 initialisiert, wenn man
    DriverInfo asioDriverInfo = {}; schreiben würde?

    Naja, ganz so pauschal kann man das nicht sagen. Eine Struktur kann ja nicht nur int's und dergleichen enthalten, sondern auch andere komplexe Objekte. Der Standard spricht hier von value-initialized bei Membern, die nicht explizit initialisiert werden. Und das bedeutet letztendlich Folgendes:

    To value-initialize an object of type T means:
    — if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
    — if T is a non-union class type without a user-declared constructor, then every non-static data member and base-class component of T is value-initialized;
    — if T is an array type, then each element is value-initialized;
    — otherwise, the object is zero-initialized

    Was letztendlich soviel bedeutet wie, wenn der Member kein Objekt einer Klasse ist, welche einen benutzerdefinierten ctor hat, dann wird nullinitialisiert. Und das wiederum bedeutet Folgendes:

    To zero-initialize an object of type T means:
    — if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;
    — if T is a non-union class type, each nonstatic data member and each base-class subobject is zero-initialized;
    — if T is a union type, the object’s first named data member is zero-initialized;
    — if T is an array type, each element is zero-initialized;
    — if T is a reference type, no initialization is performed.


Anmelden zum Antworten