struct gleich nach Deklaration initialisieren ?
-
Hallo Leutz,
Habe gerade folgendes gelesen:
Structs können ähnlich Arrays schon bei der Definition Werte bekommen:
struct Note_s {
char *pitch;
int duration;
};
struct Note_s shortG = {"g", 3};Die Anfangswerte werden in der Reihenfolge angegeben, in der die Elemente in der Strukturdeklaration stehen. Bei größeren structs wird das ziemlich unübersichtlich, weshalb gcc und C99 folgendes erlauben:
struct Note_s shortG = {.pitch="g", .duration=3};
Mein gcc (Ok, MinGW) meckert beim Compileren von
static TRACKMOUSEEVENT ME= {.cbSize=sizeof(TRACKMOUSEEVENT), .dwFlags=TME_HOVER | TME_LEAVE, .hwndTrack=hwnd, .dwHoverTime=1000};
aber stets error: syntax error before `.' token
geht das nun oder nicht, structs auf die Art zu initialiseren ?
Vielen Dank schonmal,
Biff
-
Kann es sein, daß der Compiler auf C++ gestellt ist
$ gcc datei.c
funktioniert,
$ g++ datei.c
liefert "syntax error before `.' token"...
-
Hmm, ja hast wahrscheins recht. Es funktioniert als C++
aber auch, wenn man den Bezeichner des structs mit angibt:static TRACKMOUSEEVENT ME={ME.cbSize=sizeof(TRACKMOUSEEVENT), ME.dwFlags=TME_HOVER | TME_LEAVE, ME.hwndTrack=hwnd, ME.dwHoverTime=1000};
Manchmal hilft einfach rumprobieren. Danke,
Bif f
-
Biff Malibu schrieb:
static TRACKMOUSEEVENT ME={ME.cbSize=sizeof(TRACKMOUSEEVENT), ME.dwFlags=TME_HOVER | TME_LEAVE, ME.hwndTrack=hwnd, ME.dwHoverTime=1000};
Manchmal hilft einfach rumprobieren.
Nee, meistens hilft Wissen-was-man-tut mehr
Kannst ja mal versuchen, die Reihenfolge zweier Felder mit gleichem Typ zu vertauschen (z.B. dwFlags und dwHoverTime)
Du hast da nicht die C++-Variante der Initialisierung mit benannten Felder gefunden. Es handelt sich um ganz simple Zuweisungen, zusammen mit der herkömmlichen reihenfolgebasierten Initialisierung. Ich würde davon unbedingt absehen und mich auf eine der beiden Varianten beschränken (dadurch würde z.B. auch die doppelte Initialisierung wegfallen). Also entweder:
static TRACKMOUSEEVENT ME = { sizeof(TRACKMOUSEEVENT), TME_HOVER|TME_LEAVE ... };
oder ... das zweite passt nicht gut mit dem static zusammen, ich nenns daher nur der Form halber:
static TRACKMOUSEEVENT ME; ME.cbSize = ...