C:如何访问不同类型的匿名或未命名的嵌套结构

时间:2016-07-19 11:21:59

标签: c struct anonymous-struct

我注意到有几种方法可以在C中定义其他结构中的结构:

struct s {
    int abc;

    struct {
        int a;
    };

    struct {
        int b;
    } intern;

    struct i {
        int c;
    };

    struct i2 {
        int d;
    } intern2;

    struct i3 {
        int e;
    };
    struct i3 intern3;
};

这个结构使用gcc或g ++编译很好,所以我假设所有参数都可以通过某种方式访问​​。我试过这样的话:

int main(int argc, char const *argv[])
{
    struct s mystruct;

    mystruct.abc = 0;
    mystruct.a = 1;
    mystruct.intern.b = 2;
    mystruct.c = 3; // <-- does not compile
    mystruct.intern2.d = 4;
    mystruct.intern3.e = 5;

    return 0;
}

除了访问mystruct.c之外,所有内容都会编译(编译错误消息为‘struct s’ has no member named ‘c’)。我是否以正确的方式访问struct参数?还有替代品吗?如何访问c参数?

4 个答案:

答案 0 :(得分:3)

在您的代码中,

struct i {
        int c;
    };

没有struct i类型的成员变量,也没有资格获得匿名结构 注意。如果您创建该类型的变量,您将能够访问成员变量c,类似于您使用struct i3变量对intern3所做的操作。

添加一些关于您看到的错误消息,

  

struct s没有名为c

的成员

因为,在匿名结构的情况下,成员被视为包含结构的直接成员。如果struct定义带有标记,则该结构不是匿名结构,结构成员需要访问该类型的结构变量。

注:

关于匿名结构,引用C11,章节§6.7.2.1,(强调我的

  

一个未命名的成员,其类型说明符是结构说明符,没有标记,称为   匿名结构;一个未命名的成员,其类型说明符是一个联合说明符   没有标签被称为匿名联盟。匿名结构或联合的成员   被认为是包含结构或联合的成员。这适用   如果包含的结构或联合也是匿名的,则递归地进行。

答案 1 :(得分:3)

来自gcc docs

  

在ISO C11允许的情况下以及与其他编译器的兼容性,   GCC允许您定义包含的结构或联合,如   没有名字的领域,结构和工会。例如:

 struct {
   int a;
   union {
     int b;
     float c;
   };
   int d;
 } foo;
  

在此示例中,您可以访问未命名联合的成员   代码如'foo.b'。

您可以到达mystruct.a因为结构没有标记。您无法访问mystruct.c,因为c的包含结构标记为i

变化:

 struct i {
        int c;
    };

struct {
    int c;
}

你应该能够到达mystruct.c

答案 2 :(得分:0)

会员<div class="cube"></div>c内宣布。而且您没有为strut i创建任何变量。

因此,您无法访问成员struct i

当您提到c时,它希望mystruct.c成为结构c的成员,而不是。{/ p>

答案 3 :(得分:0)

如果您没有为您的狗命名,则无法将其称为

这正是未命名所说的 - 它没有名称,因此您无法按名称访问它。

在结构中拥有未命名成员的唯一原因是,如果您正在镜像外部给定的结构,并且您不关心它的特定部分,那么您只能命名要访问的部分。