我发现一个代码实现为下面显示的类似演示..
struct st
{
int a;
struct
{
int b;
};
};
在struct/union
structs/unions
字段
ISO C11
允许。
但它有什么好处?
因为无论如何我可以像
那样访问数据成员int main()
{
struct st s;
s.a=11;
s.b=22;
return 0;
}
使用,
在gcc 4.5.2上编译gcc -Wall demo.c -o demo
并且没有错误,
答案 0 :(得分:14)
它不一定是结构中的匿名结构,我觉得它没有用:这通常只会通过引入更多填充来稍微改变布局,而没有其他可见效果(与内联成员相比)子结构到父结构中。)
我认为匿名结构/联合的优势在于其他地方: 它们可用于在结构内部的联合或匿名联合中放置匿名结构。
示例:
union u
{
int i;
struct { char b1; char b2; char b3; char b4; };
};
答案 1 :(得分:12)
好处很明显,不是吗?它可以避免程序员提出一个名字!自naming things is hard以来,如果没有实际需要,可以避免这样做。
这也是一个非常明确的信号,这个struct
是本地的,并且从未在其他任何地方使用,但在父结构中作为字段的上下文中,这是非常非常好的信息,因为它减少了不必要耦合的可能性。
将其视为static
;它将内部struct
的可见性限制为外部static
,其方式类似于(但当然不等同于){{1}}如何限制全局符号对编译单元的可见性他们出现了。
答案 2 :(得分:1)
我刚刚遇到了匿名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
,但没有正确的源语句表示如此。相反,使用struct
将各种memcpy()
变量复制到此区域。更糟糕的是,有时这是通过全局变量的实际名称,有时通过指向全局变量的指针。
通常随着时间的推移而发生,最近的变化导致其他结构之一成为最大的结构。我面临着不得不经历一百个文件,寻找这个以及所有各种别名和其他所有内容的使用位置。
然后我想起了匿名工会。所以我将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;
然后重新编译每一件事。
所以现在所有那些源代码审查和回归测试的日子,我不幸地期待不再需要。
我现在可以开始使用这个全局缓慢修改源代码的过程,以便在我自己的时间表上将此源提升到更现代的标准。