【问题标题】:using pre-defined structs anonymously in gcc?在 gcc 中匿名使用预定义的结构?
【发布时间】:2012-06-15 18:07:16
【问题描述】:

在 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”与“object”不匹配,因此很难或不可能从支持的其他语言进行自动绑定隐藏对象指针。)

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

【问题讨论】:

  • 阅读编译器的消息,迈克尔。它有重要的事情要告诉你。

标签: c gcc struct anonymous


【解决方案1】:

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 asstruct foo { int a; };',对先前定义的结构或联合的引用例如 `struct foo;',或对先前定义的结构或联合类型的 typedef 名称的引用。

 struct s1 { int a; };
 struct s2 { struct s1; };

【讨论】:

  • 我不想使用名字,我希望它是匿名的。
  • 是的,看起来我们都在同时打字。所以你基本上是在说这是不可能的......
  • 所以看起来你只需要使用-fms-extensions 标志就可以了。
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 2019-05-02
  • 2012-02-27
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
相关资源
最近更新 更多