Они не должны быть! Параметр по умолчанию может быть любым выражением в рамках определенных ограничений. Это оценено каждый раз, когда функция вызвана.
В C имя типа struct KEY_STATE
.
Итак, вы должны объявить вторая структура как
typedef struct _DEVICE_EXTENSION
{
WDFDEVICE WdfDevice;
struct KEY_STATE kState;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
Если вы не хотите постоянно писать struct
, вы можете использовать typedef declare 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 каждый раз, когда вы будете объявлять переменную этого типа.
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':
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;