C和C ++中struct的区别

时间:2009-09-29 13:59:50

标签: c++ c windows winapi kmdf

我正在尝试将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结构仍会导致此错误,实际上会导致更多错误。没有免费的括号或太多括号中的东西,这是文章建议的另一件事。

5 个答案:

答案 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_STATEstruct 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;