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_STATEtypes的variables:

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

导致错误C2061:语法错误:标识符'KEY_STATE'

…上线KEY_STATE kState; 如果这有什么区别的话,我正在用WDK编译器构build。 这当然是在一个头文件中。 我将C ++ WDM驱动程序移植到WDF和C.

这是C2061的MSDN文章 。

初始化器可以用圆括号括起来。 为了避免这个问题,将声明符括在括号内或者使其成为一个typedef。

编译器检测到expression式为类模板参数时也可能导致此错误。 使用typename来告诉编译器它是一个types。

将KEY_STATE更改为typedef结构仍导致此错误,实际上导致更多。 有太多的括号中没有自由的括号或者东西,这是文章提出的另一件事情。

在C中,类型的名字是struct KEY_STATE

所以你必须声明第二个结构体

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

如果你不想一直写struct ,那么可以使用类似于DEVICE_EXTENSION的typedef声明DEVICE_EXTENSION

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

在C99之前,C中没有bool类型。

此外,当您执行struct KEY_STATE时,没有称为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; 

您需要使用struct KEY_STATE来引用struct KEY_STATE 在C ++中,您可以将struct放出,但不能用普通的C语言。

另一个解决方案是做一个类型别名:

typedef struct KEY_STATE KEY_STATE

现在KEY_STATEstruct KEY_STATE含义相同

你可以/应该键入结构,这样你就不需要每次你声明一个该类型的变量时使用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; 

您必须使用“struct”关键字来限定结构变量:

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

当你使用DEVICE_EXTENSION时,你不必使用'struct',因为你正在一个复合语句中做一个结构定义和一个typedef。 所以如果你想以相似的方式使用它,你可以为KEY_STATE做同样的事情:

 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;