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

时间:2012-11-14 09:54:30

标签: c struct unions

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

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

struct/union

中的6.58个未命名的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 

并且没有错误,

3 个答案:

答案 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;

然后重新编译每一件事。

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

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