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

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

struct st { int a; struct { int b; }; }; 

6.58 struct/union未命名的struct/union字段

ISO C11允许的范围内。

但它有什么好处呢?

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

 int main() { struct st s; sa=11; sb=22; return 0; } 

在gcc 4.5.2上编译,用

 gcc -Wall demo.c -o demo 

并没有错误,

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

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

例:

 union u { int i; struct { char b1; char b2; char b3; char b4; }; }; 

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

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

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

我刚刚遇到匿名union的巨大好处。 但是请注意,这不是一个胆小的故事,也不是一个推荐的做法。

在一个包含数百个源代码文件的旧C程序中,有一个全局变量,一个struct ,它包含一个struct作为成员。 所以全局变量的类型定义看起来像:

 typedef struct { LONG lAmount; STRUCTONE largeStruct; // memory area actually used for several different struct objects ULONG ulFlags; } STRUCTCOMMON; 

struct STRUCTONE是几个大型结构中的一个,但是在编写代码时其他结构都比STRUCTONE小。 所以这个内存区域, largeStruct被用作union但没有正确的源语句表示如此。 而是使用memcpy()将各种struct变量复制到该区域。 更糟糕的是,有时这是通过全局变量的实际名称,有时通过指向全局变量的指针。

通常随着时间的推移发生,最近的变化导致其他结构之一成为最大的结构。 我面临着不得不经历一百个文件,寻找这个被使用的地方以及所有各种别名和其他所有内容。

然后我想起了匿名工会。 所以我将typedef修改为以下内容:

 typedef struct { LONG lAmount; union { // anonymous union to allow for allocation of largest space needed STRUCTONE largeStruct; // memory area actually used for several different struct objects STRUCTTHREE largerStruct; // memory area for even larger struct }; ULONG ulFlags; } STRUCTCOMMON; 

然后重新编译每一件事。

因此,现在所有那些源代码审查和回归测试的日子,我不幸地期待不再需要。

现在我可以开始使用这个全局缓慢修改源代码的过程,在我自己的时间表上将此源提升到更现代的标准。