在gcc中可以创建一个匿名结构,如下所示:
struct test2 {
struct {
int x;
int y;
};
int z;
};
但是当我尝试使用预定义版本的匿名结构做同样的事情时,它会失败:
struct test1 {
int x;
int y;
};
struct test2 {
struct test1;
int z;
};
我想要这样做的原因是我想要定义一个结构,该结构包含一组与C类的“成员函数”相对应的函数指针。如果我不匿名地包含结构,那么我最终不得不做一些令人讨厌的事情:
object->API->function(object,...);
这对于我需要做的一些事情只是普通的(例如,由于“object.API”与“对象”不匹配,因此很难或不可能从其他支持的语言进行自动绑定隐藏对象指针。)
目前,我只是复制/粘贴功能,但这很乏味且容易出错。我可以使用C预处理器,但是创建一个包含大量函数原型的宏似乎很难看。
答案 0 :(得分:5)
struct test1
是结构类型的名称。您缺少该字段的名称(除了内联定义的结构或联合之外,您不能拥有“匿名”字段。)
struct test2 {
struct test1 myStructTest1;
int z;
};
编辑:显然有GCC extension允许你这样做:-fms-extensions
除非使用-fms-extensions,否则未命名字段必须是没有标记的结构或联合定义(例如,
struct { int a; };'). If -fms-extensions is used, the field may also be a definition with a tag such as
struct foo {int a;};',对先前定义的结构的引用或者诸如`struct foo;'之类的联合,或者对先前定义的结构或联合类型的typedef名称的引用。
struct s1 { int a; };
struct s2 { struct s1; };