例子:
#include <stdio.h>
struct not_inner {
int a;
int b;
};
struct outer {
struct {
int a;
int b;
} x;
struct not_inner y;
};
int main()
{
struct outer O = {1, 2, 3, 4};
//x.a = 5;
printf("%d %d %d %d", O.x.a, O.x.b, O.y.a, O.y.b);
return 0;
}
主要是,我对 x 和 y 之间的区别感兴趣:
范围:
x
和 y
仅作为 struct outer
对象的成员存在。
struct outer
和 struct not_inner
的范围是翻译单元(.c 文件)。
[C99 §6.7.2.1¶7] struct-or-union-specifier 中存在的 struct-declaration-list 声明了翻译单元中的新类型。 [...]
速度:
类型在运行时不存在。
O.x.a
和 O.y.a
都直接访问成员。所以申报的细节对速度没有影响。即使有,您也不会在标准中找到它。
结构中的结构与作为周围结构一部分的命名匿名结构有什么区别?
[N]amed anonymous struct”是一个奇怪的短语,但我认为你是指
x
的成员struct outer
。我会称其为未标记结构类型的成员。它绝对不是 anonymous struct —— 具有特定的、更自然的含义和不同的意义。
主要是我对x和y有什么区别感兴趣 关于:
- c99 标准
两种形式都同样符合 C99 和 C 的所有后续版本。
- 访问速度
没有理由认为是否标记结构类型会导致访问速度有任何差异。结构标记没有运行时表示。
- 范围
除非它有
typedef
别名,否则不能在它出现的声明之外引用未标记的结构类型。但这不会影响对任何声明为该类型的对象的访问,也不会影响对其成员的访问,也不会阻止声明 compatible 类型。你可以用你的outer.x
做任何你可以用你的outer.y
做的事情,但是你可能想做的一些事情需要更多的x
代码。
请注意,您为
x
呈现的特定形式有点不寻常(尽管肯定不是未知的),但这些方面的变化相对常见:
typedef struct {
int a;
int b;
} untagged_struct;
struct outer2 {
untagged_struct x;
struct not_inner y;
};
outer2.x
的类型也是untagged结构类型。拥有该类型的 typedef
别名基本上解决了所有可能使 outer.x
上的某些操作比 outer.y
上的类似操作需要更多代码的问题。
然而,就风格而言,我个人更喜欢避免使用
typedef
,特别是对于结构类型。我宁愿写(和看)struct my_struct
而不是my_struct
或类似的东西。
C中没有“命名匿名结构”这样的概念
匿名结构的运动定义如下(6.7.2.1结构和联合说明符)
13 没有标签的结构类型的未命名成员称为 匿名结构;
在你的程序中没有匿名结构。
结构内
struct outer
struct outer {
struct {
int a;
int b;
} x;
struct not_inner y;
};
声明了一个未命名结构的数据成员(没有结构标签名称)。因此,与结构
struct not_inner
相反,您不能引用未命名的结构说明符。
标签名称
outer
和 not_inner
具有文件范围。
无名结构和结构体访问数据成员的速度没有区别
not_inner
.