structs initialisieren



  • Hoi,

    offenbar kann man nen struct ja so initialisieren:

    struct foo {
    int i;
    double d;
    };
    
    foo f = {2, 3.3};
    

    Aber folgendes raffe ich jetzt nicht: Ich hab ne Struktur D3DXFONT_DESC, die sieht so aus:

    struct D3DXFONT
    {
        INT Height;
        UINT Width;
        UINT Weight;
        UINT MipLevels;
        BOOL Italic;
        BYTE CharSet;
        BYTE OutputPrecision;
        BYTE Quality;
        BYTE PitchAndFamily;
        CHAR FaceName[LF_FACESIZE];
    };
    

    Logischerweise geht das jetzt nicht:

    D3DXFONT_DESC d;
    d.FaceName = "foo";
    

    Aber wieso bitte geht dann DAS hier:

    D3DXFONT_DESC fontDesc = { fontHeight, 0, static_cast<unsigned int>(fontWeight * 1000), 0, italic, DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_PITCH, "foo" };
    

    Die Werte in den Klammern { } werden doch einfach 1:1 den Werten der Struktur zugewiesen. Wieso geht dann die Zuweisung von "foo" an FaceName nicht schief?


  • Mod

    strukteur schrieb:

    Wieso geht dann die Zuweisung von "foo" an FaceName nicht schief?

    Weil es keine Zuweisung ist.



  • Was dann?



  • strukteur schrieb:

    Was dann?

    Ich glaube es ist eine Initialisierung im Sinne eines Konstruktors. Folgendes geht ja auch: char foo[4] = "foo";


  • Mod

    strukteur schrieb:

    Was dann?

    Eine Initialisierung.

    T x = a;
    

    ist eine Initialisierung (und eine Definition).

    x = a;
    

    ist eine Zuweisung. Initialisierung bei Aggregaten (wie hier) zerfällt in die Initialisierung der einzelnen Elemente. Dort gilt aber weiterhin die gleiche Semantik:

    char x[5] = "foo"; // ok, oder
    char x[5] = { "foo" }; // aber nicht:
    x = "foo"; // arrays kann nicht zugewiesen werden (x ist hier trotzdem ein lvalue ;) )
    
    struct Y { char x[5]; };
    Y y = { "foo" }; // ok, oder
    Y y = { { "foo" } }; // aber nicht:
    y.x = "foo";  // arrays kann nicht zugewiesen werden
    


  • Davon mal abgesehen das auch structs Konstruktoren haben können und man (ok in dem Beispiel nicht ideal) auch nen bissel Tipparbeit nachher sparen kann 😉


Anmelden zum Antworten