Вопрос

Я пытаюсь преобразовать структуру 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'

...на линии КЛЮЧ_STATE kState; Я создаю с помощью компилятора WDK, если это имеет какое-либо значение.Это, конечно, в заголовочном файле.Я портирую драйвер C ++ WDM на WDF и C.

Это статья MSDN для C2061.

Инициализатор может быть заключен в круглые скобки.Чтобы избежать этой проблемы, заключите декларатор в круглые скобки или сделайте его typedef .

Эта ошибка также может быть вызвана, когда компилятор обнаруживает выражение в качестве аргумента шаблона класса;используйте typename, чтобы сообщить компилятору, что это тип.

Изменение KEY_STATE на typedef struct по-прежнему вызывает эту ошибку и на самом деле вызывает намного больше.Здесь нет свободных круглых скобок или чего-то в слишком большом количестве круглых скобок, это еще одна вещь, о которой говорится в статье.

Это было полезно?

Решение

В 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;

Другие советы

Там нет никакого 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;

Вам нужно обратиться к KEY_STATE с struct KEY_STATE.В C ++ вы можете оставить struct наружу, но не в простом виде C.

Другое решение - создать псевдоним типа:

typedef struct KEY_STATE KEY_STATE

Сейчас KEY_STATE означает то же самое , что и struct KEY_STATE

Вы могли бы / должны ввести значение struct, чтобы вам не требовалось ключевое слово 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 с ключевым словом 'struct':

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

Когда вы используете DEVICE_EXTENSION, вам не нужно использовать 'struct', потому что вы выполняете определение 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top