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.

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top