我注意到有几种方法可以在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
参数?
答案 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)
如果您没有为您的狗命名,则无法将其称为
这正是未命名所说的 - 它没有名称,因此您无法按名称访问它。
在结构中拥有未命名成员的唯一原因是,如果您正在镜像外部给定的结构,并且您不关心它的特定部分,那么您只能命名要访问的部分。