我发现了如下图所示的类似的演示中实现的一个代码..
struct st
{
int a;
struct
{
int b;
};
};
6.58无名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
并没有错误,
这并不一定是一个结构,我不觉得非常有用的内部匿名结构:这通常只有引入更多的填充改变布局咯,没有其他明显的影响(相对于儿童结构的成员内联成母体结构)。
我认为,匿名结构/联合的优势是其他地方:它们可以用来放置一个工会内的匿名结构或匿名联合的结构内。
例:
union u
{
int i;
struct { char b1; char b2; char b3; char b4; };
};
好处是很明显的,不是吗? 它节省了从程序员想出一个名字! 既然命名东西就很难 ,这是不错的,它可能避免这样做,如果没有真正的需要。
这也是一个非常明确的信号,这种struct
是局部的,从未使用过其他地方,但在被父结构,这是一个真正的现场,非常好的信息,因为它减少了不必要的耦合的可能性范围内。
把它看成是static
; 它限制内的可见性struct
的外一个,以类似于(但不是,当然,用当量)的方式如何static
限制全局符号在它们出现的编译单元的可视性。
我只是碰到了匿名的巨大的利益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;
然后重新编译每一件事情。
所以,现在的源代码审查和回归测试我正闷闷不乐地期待着所有那些日子不再有必要。
我现在就可以开始使用这种全球在我自己的时间表把这个源达更现代的标准慢慢修改源的过程。