I am trying to convert a C++ struct to C but keep getting "undeclared identifier"? Does C++ have a different syntax for referring to structs?
struc
You need to refer to KEY_STATE
with struct KEY_STATE
. In C++ you can leave the struct
out, but not in plain C.
Another solution is to do a type alias:
typedef struct KEY_STATE KEY_STATE
Now KEY_STATE
means the same thing as struct KEY_STATE
In C, the name of the type is struct KEY_STATE
.
So you have to declare the second struct as
typedef struct _DEVICE_EXTENSION
{
WDFDEVICE WdfDevice;
struct KEY_STATE kState;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
If you do not want to write struct
all the time, you can use a typedef declare KEY_STATE
similar to DEVICE_EXTENSION
:
typedef struct _KEY_STATE
{
/* ... */
} KEY_STATE;
You could/should typedef the struct so that you don't need the struct keyword every time you will declare a variable of that type.
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;
Now you can do:
KEY_STATE kState;
or (as in the example you have) :
struct KEY_STATE kState;
You have to qualify a struct variable with the 'struct' keyword:
typedef struct _DEVICE_EXTENSION
{
WDFDEVICE WdfDevice;
struct KEY_STATE kState;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
When you use DEVICE_EXTENSION you don't have to do use 'struct' because you are doing a struct definition and a typedef in a single compound statement. So you could do the same for KEY_STATE if you wanted to use it in a similar fasion:
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;
There is no bool
type in C prior to C99.
Also, there is no type called KEY_STATE
when you do struct KEY_STATE
.
Try this instead:
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;