为什么这个c结构有效?

时间:2017-01-06 08:12:50

标签: c windows wdk

我在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;
}

所有看起来都与窗口示例代码相同,但它在哪里错了?

3 个答案:

答案 0 :(得分:4)

WDK代码示例中使用的语法是C中结构继承的Microsoft扩展。但是您的错误消息看起来像gcc错误消息。

如果您实际使用的是gcc,可以尝试使用-fms-extensions进行构建。

Link to related answer

答案 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;
}