在gcc中匿名使用预定义的结构?

Mic*_*ael 2 c gcc struct anonymous

在gcc中,可以创建一个匿名结构,如下所示:

struct test2 {
    struct {
            int x;
            int y;
    };
    int z;
};
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用预定义版本的匿名结构做同样的事情时,它会失败:

struct test1 {
    int x;
    int y;
};

struct test2 {
    struct test1;
    int z;
};
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因是我想要定义一个结构,它包含一组与C类的"成员函数"相对应的函数指针.如果我不匿名包含结构,那么我最终不得不做一些令人讨厌的事情:

object->API->function(object,...);
Run Code Online (Sandbox Code Playgroud)

对于我需要做的一些事情,这只是普通的不起作用(例如,因为"object.API"与"对象"不匹配,所以很难或不可能从支持隐藏的其他语言进行自动绑定对象指针.)

目前,我只是复制/粘贴函数,但这很乏味且容易出错.我可以使用C预处理器,但是创建一个包含大量函数原型的宏似乎很难看.

use*_*016 5

struct test1是结构类型的名称.您缺少该字段的名称(除了内联定义的结构或联合之外,您不能拥有"匿名"字段).

struct test2 {
    struct test1 myStructTest1;
    int z;
};
Run Code Online (Sandbox Code Playgroud)

编辑:显然有一个GCC扩展,允许你这样做:-fms-extensions

除非使用-fms-extensions,否则未命名字段必须是没有标记的结构或联合定义(例如,struct { int a; };'). If -fms-extensions is used, the field may also be a definition with a tag such asstruct foo {int a;};',对先前定义的结构或联合的引用,例如`struct foo; ',或对先前定义的结构或联合类型的typedef名称的引用.

 struct s1 { int a; };
 struct s2 { struct s1; };
Run Code Online (Sandbox Code Playgroud)