2009-09-29 65 views
15

我想將C++結構轉換爲C,但不斷得到「未聲明的標識符」? C++有引用結構的不同語法嗎?結構在C和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 
}; 

我使用類型KEY_STATE的可變另一結構內:

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

導致錯誤C2061:語法錯誤:標識符 'KEY_STATE'

...上線KEY_STATE kState;我正在用WDK編譯器構建,如果這有什麼區別的話。這當然在頭文件中。我將C++ WDM驅動程序移植到WDF和C.

This is the MSDN article for C2061

初始值設定項可以用括號括起來。爲了避免這個問題,可以將聲明符括在括號中,或者將其定義爲typedef。

當編譯器檢測到表達式作爲類模板參數時,也可能導致此錯誤;使用typename來告訴編譯器它是一個類型。

將KEY_STATE更改爲typedef結構仍導致此錯誤,實際上會導致更多。在太多的括號中沒有可用的括號或內容,這是該文章建議的另一件事。

回答

30

在C,該類型的名稱是struct KEY_STATE

所以,你必須聲明第二結構作爲

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

如果你不想寫struct所有的時間,你可以使用一個typedef聲明KEY_STATE類似DEVICE_EXTENSION

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

感謝北京天寶,解決我的問題:) – 2009-09-29 16:35:17

6

您需要參考KEY_STATEstruct KEY_STATE。在C++中,你可以離開struct出來,而不是在平原C.

另一種解決方案是做一個類型別名:

typedef struct KEY_STATE KEY_STATE

現在KEY_STATE意味着同樣的事情struct KEY_STATE

+0

嗯,確實有人只是downvote所有的答案?爲什麼? – hrnt 2009-09-29 14:08:43

+0

+1爲清晰,簡短和精確。 – 2014-01-01 13:07:15

5

你可以/應該鍵入這個結構,這樣你就不需要每次你聲明這個類型的變量時使用struct關鍵字。

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; 

現在你可以這樣做:

KEY_STATE kState; 

或(在你的例子):

struct KEY_STATE kState; 
4

必須限定一個結構體變量用 '結構' 關鍵詞:

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

當您使用DEVICE_EXTENSION時,您d不必使用'struct',因爲你在單個複合語句中執行一個結構定義和一個typedef。所以,你可以做同樣的KEY_STATE,如果你想在一個類似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

沒有bool輸入C之前C99。

而且,沒有類型,稱爲KEY_STATE當你做struct KEY_STATE

試試這個:

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感謝時,布爾是導致一堆更錯誤,我聽不太懂 – 2009-09-29 14:16:14