我在windows驱动程序工具包(WDK)示例中看到了flow c语言代码:
typedef struct _COMMON_DEVICE_DATA
{
PDEVICE_OBJECT Self;
BOOLEAN IsFDO;
......................
} COMMON_DEVICE_DATA, *PCOMMON_DEVICE_DATA;
typedef struct _PDO_DEVICE_DATA
{
COMMON_DEVICE_DATA;
PDEVICE_OBJECT ParentFdo;
.................
} PDO_DEVICE_DATA, *PPDO_DEVICE_DATA;
但是,当我想测试smillar代码时,它会构建错误。
test.c:14:6: error: ‘AA’ has no member named ‘flag’
a.flag = 1;
将代码测试为fllow:
typedef struct __COMMON_DATA{
int flag;
}COMMON_DATA;
typedef struct __AA{
COMMON_DATA;
int x;
int y;
}AA;
int main(int argc, char *argv[])
{
AA a;
a.flag = 1;
return 0;
}
所有看起来都与窗口示例代码相同,但它在哪里错了?
答案 0 :(得分:4)
WDK代码示例中使用的语法是C中结构继承的Microsoft扩展。但是您的错误消息看起来像gcc错误消息。
如果您实际使用的是gcc,可以尝试使用-fms-extensions
进行构建。
答案 1 :(得分:0)
没有名为 flag 的成员,因为AA没有名为flag
的成员typedef struct __AA{
COMMON_DATA aa_flag;
int x;
int y;
}AA;
您应该访问不在AA struct
中的COMMON_DATA结构中的实际标志a.aa_flag.flag = 1;
答案 2 :(得分:0)
如果您使用-Wall -Wextra -pedantic
进行编译,则可以在出错前看到此警告:
./struct.c:6:16: warning: declaration does not declare anything
COMMON_DATA;
可以使用变量的附加名称来修复代码。这很好用:
typedef struct __COMMON_DATA{
int flag;
}COMMON_DATA;
typedef struct __AA{
COMMON_DATA cd;
int x;
int y;
}AA;
int main(int argc, char *argv[])
{
AA a;
a.cd.flag = 1;
return 0;
}