Unterschiede zwischen struct in C und C++
Frage
Ich versuche, eine C++-Struktur in C zu konvertieren, erhalte aber ständig die Meldung „nicht deklarierte Kennung“?Verfügt C++ über eine andere Syntax für den Verweis auf Strukturen?
struct KEY_STATE
{
bool kSHIFT; //if the shift key is pressed
bool kCAPSLOCK; //if the caps lock key is pressed down
bool kCTRL; //if the control key is pressed down
bool kALT; //if the alt key is pressed down
};
Ich verwende eine Variable vom Typ KEY_STATE in einer anderen Struktur:
typedef struct _DEVICE_EXTENSION
{
WDFDEVICE WdfDevice;
KEY_STATE kState;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
ergibt Fehler C2061:Syntax-Fehler :Bezeichner 'KEY_STATE'
...an der Leitung KEY_STATE kState; Ich baue mit dem WDK-Compiler, falls das einen Unterschied macht.Dies ist natürlich in einer Header-Datei.Ich portiere den C++ WDM-Treiber auf WDF und C.
Dies ist der MSDN-Artikel für C2061.
Ein Initialisierer kann in Klammern eingeschlossen werden.Um dieses Problem zu vermeiden, schließen Sie den Deklarator in Klammern ein oder machen Sie ihn zu einer Typdefinition.
Dieser Fehler kann auch verursacht werden, wenn der Compiler einen Ausdruck als Klassenvorlagenargument erkennt;Verwenden Sie den Typnamen, um dem Compiler mitzuteilen, dass es sich um einen Typ handelt.
Das Ändern von KEY_STATE in typedef struct verursacht immer noch diesen Fehler und verursacht tatsächlich noch viel mehr.Es gibt keine freien Klammern oder Dinge in zu vielen Klammern, das ist die andere Sache, die der Artikel nahelegt.
Lösung
In C, der Name des Typs ist struct KEY_STATE
.
So haben Sie die zweite Struktur wie
zu erklären,typedef struct _DEVICE_EXTENSION
{
WDFDEVICE WdfDevice;
struct KEY_STATE kState;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
Wenn Sie wollen die ganze Zeit nicht schreiben struct
, können Sie ein typedef declare KEY_STATE
ähnlich verwenden, um DEVICE_EXTENSION
:
typedef struct _KEY_STATE
{
/* ... */
} KEY_STATE;
Andere Tipps
Es gibt keinen bool
Typen in C vor dem C99.
Außerdem gibt es keinen Typen namens KEY_STATE
wenn Sie struct KEY_STATE
tun.
Versuchen Sie stattdessen:
typedef struct _KEY_STATE
{
unsigned kSHIFT : 1; //if the shift key is pressed
unsigned kCAPSLOCK : 1; //if the caps lock key is pressed down
unsigned kCTRL : 1; //if the control key is pressed down
unsigned kALT : 1; //if the alt key is pressed down
} KEY_STATE;
Sie müssen sich darauf beziehen KEY_STATE
mit struct KEY_STATE
.In C++ können Sie das verlassen struct
raus, aber nicht in einfachem C.
Eine andere Lösung besteht darin, einen Typalias zu erstellen:
typedef struct KEY_STATE KEY_STATE
Jetzt KEY_STATE
bedeutet dasselbe wie struct KEY_STATE
Sie könnte / sollte die struct typedef, so dass Sie jedes Mal das Schlüsselwort struct nicht benötigen Sie eine Variable dieses Typs deklarieren.
typedef struct _KEY_STATE
{
bool kSHIFT; //if the shift key is pressed
bool kCAPSLOCK; //if the caps lock key is pressed down
bool kCTRL; //if the control key is pressed down
bool kALT; //if the alt key is pressed down
} KEY_STATE;
Jetzt können Sie tun:
KEY_STATE kState;
oder (wie im Beispiel Sie haben):
struct KEY_STATE kState;
Sie haben eine Struktur Variable mit dem 'struct' Schlüsselwort zu qualifizieren:
typedef struct _DEVICE_EXTENSION
{
WDFDEVICE WdfDevice;
struct KEY_STATE kState;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
Wenn Sie DEVICE_EXTENSION verwenden Sie müssen nicht verwenden ‚Struktur‘ tun, weil Sie eine Struktur Definition und eine typedef in einer einzigen zusammengesetzten Anweisung zu tun. So könnte man das gleiche für KEY_STATE tun, wenn Sie es in einer ähnlichen fasion verwenden wollen:
typedef struct _KEY_STATE_t
{
bool kSHIFT; //if the shift key is pressed
bool kCAPSLOCK; //if the caps lock key is pressed down
bool kCTRL; //if the control key is pressed down
bool kALT; //if the alt key is pressed down
} KEY_STATE;