wo ist der unterschied?!?!?!



  • ich würde sagen wenn MS das so gecodet hat muss es ja legal sein! oder?



  • sieht sehr low level aus- und nicht alles, was ms macht muss perfekt sein 😉



  • Ms baut den Compiler, also erlauben die sich immer solch einen Mist.



  • Umm... bitte.

    Unnamed unions / structs sind keine Erfindunbg von Microsoft.

    @***: dein originaler code unterschlägt einen wichtigen Aspekt:

    [cpp]
    typedef struct _D3DMATRIX
    {
    union {
    struct { // a)
    float _11, _12, _13, _14;
    float _21, _22, _23, _24;
    float _31, _32, _33, _34;
    float _41, _42, _43, _44;

    };
    float m[4][4];
    };
    } D3DMATRIX;
    [/cpp]

    Das struct von a) liegt an der selben Stelle im Speicher wie m.

    Das einzige "nonstandard" hier ist, daß sich MS auf ein Alignment verläßt, was zwar nicht vom Standard garantiert ist, aber wohl auf jedem "sinnvollen" Compiler laufen wird.



  • peterchen schrieb:

    Unnamed unions / structs sind keine Erfindunbg von Microsoft.
    [..]
    Das einzige "nonstandard" hier ist, daß sich MS auf ein Alignment verläßt, was zwar nicht vom Standard garantiert ist, aber wohl auf jedem "sinnvollen" Compiler laufen wird.

    Es geht um den nicht erlaubten Bezeichner _D3DMATRIX
    Und dieser Bezeichner ist Non-Standard



  • Zu dem Thema hab ich vor ein paar Tagen ein richtig schönes Beispiel gesehen: So wie mache ein C oder ein T vor Klassenbezeichner setzen hat der einen Unterstrich davor gesetzt.



  • Namen mit Underscore sind für den Compilerhersteller reseviert, was es in diesem Fall legal macht (wenn auch nicht unbedingt im "Sinne" des Standards).

    Die erste Variante funktioniert auch unter einem C-Compiler.



  • *** schrieb:

    ich würde sagen wenn MS das so gecodet hat muss es ja legal sein! oder?

    Nö. Und dieser Code ist definitiv kein legales C++. Auch wenn wir mal diese komischen Unterstrich-Bezeichner ignorieren.

    1. Das ist erstmal eine Deklaration:

    struct  
    { 
        float        _11, _12, _13, _14; 
        float        _21, _22, _23, _24; 
        float        _31, _32, _33, _34; 
        float        _41, _42, _43, _44; 
    
    };
    

    Dummerweise wird hier aber eder ein Typ noch ein Objekt deklariert. Eine Deklaration muss aber immer einen Namen (wieder)einführen -> Fehler (es sei denn es handelt sich um eine "anonymous union").

    Desweiteren darf eine "anonymous union" laut 9.5/2 keine Deklarationen von nested-Typen enthalten.



  • peterchen schrieb:

    Umm... bitte.

    Unnamed unions / structs sind keine Erfindunbg von Microsoft.

    Die meinte ich auch nicht mit "Mist". Schau mal genauer hin.



  • HumeSikkins schrieb:

    Dummerweise wird hier aber weder ein Typ noch ein Objekt deklariert. Eine Deklaration muss aber immer einen Namen (wieder)einführen -> Fehler (es sei denn es handelt sich um eine "anonymous union").

    genau das meinte ich 🙂
    danke, dass du mir das nachschlagen erspart hast 🙂


Anmelden zum Antworten