Различия между struct в 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_STATE внутри другой структуры:
typedef struct _DEVICE_EXTENSION
{
WDFDEVICE WdfDevice;
KEY_STATE kState;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
приводит к ошибка C2061:синтаксическая ошибка :идентификатор 'KEY_STATE'
...на линии КЛЮЧ_STATE kState; Я создаю с помощью компилятора WDK, если это имеет какое-либо значение.Это, конечно, в заголовочном файле.Я портирую драйвер C ++ WDM на WDF и C.
Инициализатор может быть заключен в круглые скобки.Чтобы избежать этой проблемы, заключите декларатор в круглые скобки или сделайте его 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;