C中未命名的结构/联合有什么好处?

Omk*_*ant 8 c struct unions

我发现一个代码实现为下面显示的类似演示..

struct st
{
 int a;
 struct
 {
 int b;
 };
};
Run Code Online (Sandbox Code Playgroud)

6.58内未命名的struct/union字段structs/unions

在允许的情况下ISO C11.

但它有什么好处呢?

因为无论如何我可以以相同的方式访问数据成员

int main()
{
 struct st s;
 s.a=11;
 s.b=22;
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

在gcc 4.5.2上编译,用

gcc -Wall demo.c -o demo 
Run Code Online (Sandbox Code Playgroud)

并没有错误,

Pas*_*uoq 13

它不一定是结构中的匿名结构,我觉得它不是很有用:这通常只会通过引入更多填充来稍微改变布局,而没有其他可见的效果(与将子结构的成员内联到父结构).

我认为匿名结构/联合的优势在于其他地方:它们可以用于将一个匿名结构放在一个结构内部的联合或匿名联合中.

例:

union u
{
  int i;
  struct { char b1; char b2; char b3; char b4; };
};
Run Code Online (Sandbox Code Playgroud)

  • 您能解释一下如何使用该联合吗?例如,如果我有u的实例x并使用`x.b1 ='a'`,是否会初始化其余的b2,b3,b4并占用内存空间? (2认同)

unw*_*ind 11

好处很明显,不是吗?它可以避免程序员提出一个名字!由于命名事情很难,如果没有实际需要,可以避免这样做.

这也是一个非常明确的信号,这struct是本地的,并且从未在其他任何地方使用,但在父结构中作为字段的上下文中,这是非常非常好的信息,因为它减少了不必要耦合的可能性.

把它想象成static; 它struct以类似于(但当然不等同于)的方式static限制内部到外部的可见性,如何限制全局符号对它们出现的编译单元的可见性.

  • `struct`变得如此局部,以至于很难理解程序员为什么不直接在父结构中内联其成员.其当前版本中的答案并未列出与该替代方案相关的任何好处.与内联成员相比,嵌套结构的布局是不同的(具有更多填充,这可能是预期的效果,但通常被认为是一个缺点). (4认同)