2009-09-29 15 views
15

Próbuję przekonwertować strukturę C++ do C, ale wciąż otrzymuję "niezadeklarowany identyfikator"? Czy C++ ma inną składnię do odwoływania się do struktur?Różnice między strukturą C i C++

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 
}; 

Używam zmienną typu KEY_STATE wewnątrz innej struktury:

typedef struct _DEVICE_EXTENSION 
{ 
    WDFDEVICE WdfDevice; 
    KEY_STATE kState; 
} DEVICE_EXTENSION, *PDEVICE_EXTENSION; 

skutkuje błędu C2061: błąd składni: identyfikator 'KEY_STATE'

... na linii KEY_STATE kState; Buduję z kompilatorem WDK, jeśli to robi jakąkolwiek różnicę. Oczywiście jest to plik nagłówkowy. Piszę sterownik WDD C++ do WDF i C.

This is the MSDN article for C2061.

Inicjator może być ujęty w nawiasy. Aby uniknąć tego problemu, ułóż deklarator w nawiasach lub ustaw go jako typedef.

Ten błąd może również wystąpić, gdy kompilator wykryje wyrażenie jako argument szablonu klasy; użyj komendy type, aby poinformować kompilator, że jest to typ.

Zmiana KEY_STATE na typedef struct wciąż powoduje ten błąd i powoduje znacznie więcej. Nie ma wolnych nawiasów ani rzeczy w zbyt wielu nawiasach, to jest druga rzecz, którą sugeruje artykuł.

Odpowiedz

30

w C, nazwa tego typu to struct KEY_STATE.

Więc trzeba zadeklarować drugą struct jako

typedef struct _DEVICE_EXTENSION 
{ 
    WDFDEVICE WdfDevice; 
    struct KEY_STATE kState; 
} DEVICE_EXTENSION, *PDEVICE_EXTENSION; 

Jeśli nie chcesz pisać struct cały czas, można użyć typedef zadeklarować KEY_STATE podobny do DEVICE_EXTENSION:

typedef struct _KEY_STATE 
{ 
    /* ... */ 
} KEY_STATE; 
+1

dziękuje Timbo, rozwiązał mój problem :) –

6

Należy odnieść się do KEY_STATE z struct KEY_STATE. W C++ można pozostawić struct się, ale nie w zwykłym C

Innym rozwiązaniem jest zrobić alias typ:

typedef struct KEY_STATE KEY_STATE

Teraz KEY_STATE oznacza to samo, co struct KEY_STATE

+0

Uhm, czy ktoś po prostu downvote wszystkie odpowiedzi? Czemu? – hrnt

+0

+1 za bycie klarownym, krótkim i dokładnym. –

5

Możesz/powinnaś wpisać strukturę, aby nie potrzebować słowa kluczowego struct za każdym razem, gdy zadeklarujesz zmienną tego typu.

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; 

Teraz można zrobić:

KEY_STATE kState; 

lub (jak w przykładzie masz):

struct KEY_STATE kState; 
4

Musisz zakwalifikować zmiennej struct z 'struct' słowo kluczowe:

typedef struct _DEVICE_EXTENSION 
{ 
    WDFDEVICE WdfDevice; 
    struct KEY_STATE kState; 
} DEVICE_EXTENSION, *PDEVICE_EXTENSION; 

Podczas korzystania z urządzenia DEVICE_EXTENSION nie musisz używać "struct", ponieważ robisz definicję struct i typedef w pojedynczym złożonym komunikacie. Więc można zrobić to samo dla KEY_STATE jeśli chciał użyć go w podobny fasion:

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; 
16

Nie ma bool typ w C przed C99.

Ponadto nie ma typu o nazwie KEY_STATE po wykonaniu struct KEY_STATE.

Spróbuj to zamiast:

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; 
+0

+1 dziękuję, bool spowodował sporo błędów, których tak naprawdę nie rozumiałem –

Powiązane problemy