Pie*_*erV 5 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;
};
Run Code Online (Sandbox Code Playgroud)
这个结构使用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;
}
Run Code Online (Sandbox Code Playgroud)
除了访问mystruct.c
,一切都编译(编译错误消息是‘struct s’ has no member named ‘c’
).我是否以正确的方式访问struct参数?还有替代品吗?我如何访问c
参数?
在你的代码中,
\n\nstruct i {\n int c;\n };\n
Run Code Online (Sandbox Code Playgroud)\n\n没有类型的成员变量,struct i
也不符合匿名结构 Note 的条件。如果您创建该类型的变量,您将能够访问成员变量c
,类似于您对变量所做的struct i3
操作intern3
。
添加一些关于您看到的错误消息的内容,
\n\n\n\n\n\n
struct s
没有指定成员c
因为,在匿名结构的情况下,成员被视为包含结构的直接成员。如果struct
定义带有tag,则该结构不是匿名结构,并且该结构的成员需要访问该类型的结构变量。
笔记:
\n\n关于匿名结构,引用C11
,章节 \xc2\xa76.7.2.1,(重点是我的)
\n\n其类型说明符是不带标记的结构说明符的未命名成员称为\n 匿名结构;类型说明符是没有标记的联合说明符的未命名成员称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员。如果包含的结构或联合也是匿名的,则这会递归地应用。
\n