首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有匿名结构的C11结构继承

带有匿名结构的C11结构继承
EN

Stack Overflow用户
提问于 2017-10-17 07:14:47
回答 3查看 1.9K关注 0票数 5

我看到这边请在C11中使用匿名struct实现某种struct继承,并想尝试一下。以下是我所拥有的:

代码语言:javascript
复制
struct struct_a {
    int aa;
};

struct struct_b {
    struct struct_a;
    int bb;
};

int main(void)
{
    volatile struct struct_b my_b;
    my_b.aa = 5; /* not a member of my_b */
    my_b.bb = 6;

}

gcc的结果:

代码语言:javascript
复制
$ gcc -std=c11 struct_extend.c 
struct_extend.c:11:20: warning: declaration does not declare anything
     struct struct_a;
                    ^
struct_extend.c: In function ‘main’:
struct_extend.c:18:9: error: ‘volatile struct struct_b’ has no member named ‘aa’
     my_b.aa = 5; /* not a member of my_b */

相关:

代码语言:javascript
复制
$ gcc --version
gcc (Debian 6.3.0-18) 6.3.0 20170516

这不是在我的编译器中实现的,还是我做错了?

EN

回答 3

Stack Overflow用户

发布于 2017-10-17 07:41:15

根据GCC引用:使用-fms-extensions标志,这将启用此特性。

  • 除非使用-fms-extensions,否则未命名字段必须是没有标记的结构或联合定义(例如,‘struct{ int a;};’‘)。如果使用-fms-extensions,则该字段还可以是带有标记(如‘struct foo { int a; };’ )的定义、对先前定义的结构或联合(如“struct;”)的引用,或者是对先前定义的结构或联合类型的类型名称的引用。
  • 选项-fplan9-extensions支持-fms-extensions以及其他两个扩展。首先,指向结构的指针自动转换为指向匿名字段的指针,以便进行赋值和函数调用。

我用过GCC的命令,它运行得很好。

代码语言:javascript
复制
gcc -std=c11 -O2 -Wall -fms-extensions -pedantic -pthread ls.c
票数 5
EN

Stack Overflow用户

发布于 2017-10-17 07:22:09

该标准只允许结构和联合,没有标记作为未命名的成员:

6.7.2.1结构和联盟说明-第13段

是一个未命名的成员,其类型说明符是没有标记的结构说明符,称为匿名结构;类型说明符是没有标记的联合说明符的未命名成员称为匿名成员。匿名结构或工会的成员被视为包含结构或工会的成员。如果包含的结构或联合也是匿名的,则这将递归地应用。

你的答案显然是有标签的,所以它是无效的。你链接到的答案也没有更好的答案。令人遗憾的是,以一种符合标准的方式这样做是相当冗长的:

代码语言:javascript
复制
struct struct_b {
    union {
        struct struct_a _aa;
        struct { int aa; };
    };
    int bb;
};

这真的不是什么值得你印象深刻的东西。我们也许可以使用宏来避免重复成员声明,但现在它已经是一种代码味了。

票数 4
EN

Stack Overflow用户

发布于 2017-10-17 07:32:15

您似乎试图在struct_b中创建包含struct_b的匿名未命名结构,类似于以下内容:

代码语言:javascript
复制
#include <stdio.h>

struct struct_b {
    struct {
        int aa;
    };
    int bb;
};

int main(void)
{
    volatile struct struct_b my_b;
    my_b.aa = 5; /* now a member of my_b */
    my_b.bb = 6;

    printf ("my_b.aa: %d\nmy_b.bb: %d\n", my_b.aa, my_b.bb);

    return 0;
}

示例使用/输出

代码语言:javascript
复制
$ ./bin/strc2
my_b.aa: 5
my_b.bb: 6

这直接来自StoryTeller引用的标准部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46784479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档