wo ist der unterschied?!?!?!
-
Hi,
mir hat mal jemand gesagt das sich die folgenden beiden codeteile sich unterscheiden, sehe aber nur im aufbau einen unterschied und sonst nirgendes!
Drum frag ich mal die Profis wo der unterschied ist und was dieser dann bewirken würde:
typedef struct _MATRIX { union { struct { float _11, _12, _13, _14; float _21, _22, _23, _24; float _31, _32, _33, _34; float _41, _42, _43, _44; }; }; } MATRIX; // VS. class MATRIX { public: float _11, _12, _13, _14; float _21, _22, _23, _24; float _31, _32, _33, _34; float _41, _42, _43, _44; };
-
der erste code ist nicht erlaubt.
wäre er erlaubt, hätttest du folgenden unterschied:
du brächtest mit ihm 2 namen in den scope: _MATRIX und MATRIX anstatt von nur einem.
Was nicht legal ist: globale namen dürfen nicht mit underscore + großbuchstabe anfangen. außerdem ist (afair) die anonyme struct in der anonymen union nicht erlaubt. werde mal beizeiten im standard nachschlagen. hab ihn hier leider nicht./edit: außerdem dürfstest du variante 1 folgendermaßen benutzen:
struct _MATRIX a;
variante zwei so:
class MATRIX b;
das ist aber nicht so wichtig, denke ich
-
Microsoft DirectX 9.0
D3DMATRIX Structure
--------------------------------------------------------------------------------
Describes a matrix.
Syntax
typedef struct _D3DMATRIX {
union {
struct {
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;
Members_ij
An array of floats that represent a 4x4 matrix, where i is the row number and j is the column number. For example, _34 means the same as [a34].
RemarksIn Microsoft
Direct3D
, the _34 element of a projection matrix cannot be a negative number. If your application needs to use a negative value in this location, it should scale the entire projection matrix by –1 instead.
Structure Information
Header d3d9types.h
Minimum operating systems Windows 98See Also
IDirect3DDevice9::GetTransform, IDirect3DDevice9::MultiplyTransform, IDirect3DDevice9::SetTransform
--------------------------------------------------------------------------------
2002 Microsoft Corporation. All rights reserved.
-
also...?
-
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