我正在尝试将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结构仍会导致此错误,实际上会导致更多错误。没有免费的括号或太多括号中的东西,这是文章建议的另一件事。
答案 0 :(得分:30)
在C中,类型的名称为struct KEY_STATE
。
所以你必须将第二个结构声明为
typedef struct _DEVICE_EXTENSION
{
WDFDEVICE WdfDevice;
struct KEY_STATE kState;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
如果您不想一直写struct
,可以使用类似于KEY_STATE
的typedef声明DEVICE_EXTENSION
:
typedef struct _KEY_STATE
{
/* ... */
} KEY_STATE;
答案 1 :(得分:16)
C99之前的C中没有bool
类型。
此外,当您执行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;
答案 2 :(得分:6)
您需要使用KEY_STATE
来引用struct KEY_STATE
。在C ++中,您可以将struct
保留,但不能保留在普通的C中。
另一种解决方案是执行类型别名:
typedef struct KEY_STATE KEY_STATE
现在KEY_STATE
与struct KEY_STATE
答案 3 :(得分: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 :(得分:4)
您必须使用'struct'关键字限定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;