15

我正在尝试将 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。

这是 C2061 的 MSDN 文章

初始化器可以用括号括起来。为避免此问题,请将声明符括在括号中或使其成为 typedef。

当编译器将表达式检测为类模板参数时,也可能会导致此错误;使用 typename 告诉编译器它是一个类型。

将 KEY_STATE 更改为 typedef struct 仍然会导致此错误,实际上会导致更多错误。没有免费的括号或太多括号中的东西,这是文章建议的另一件事。

4

5 回答 5

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;
于 2009-09-29T14:02:44.150 回答
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;
于 2009-09-29T14:10:22.613 回答
6

您需要参考KEY_STATEwith struct KEY_STATE。在 C++ 中,您可以struct省略,但在纯 C 中则不行。

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

typedef struct KEY_STATE KEY_STATE

现在KEY_STATE的意思与struct KEY_STATE

于 2009-09-29T14:02:34.807 回答
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;
于 2009-09-29T14:05:49.013 回答
4

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

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

当您使用 DEVICE_EXTENSION 时,您不必使用“结构”,因为您在单个复合语句中执行结构定义和 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;
于 2009-09-29T14:06:54.800 回答