C中匿名结构/联合的优点是什么?
我发现如下所示的类似实施演示一个代码..C中匿名结构/联合的优点是什么?
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
和没有错误,
它不一定是一个结构体内的匿名结构体,我不觉得它非常有用:它通常只会通过引入更多的填充来改变布局,没有其他可见的效果(与内联子结构体放入父结构体中)。
我认为匿名结构/联合的优势在其他地方: 它们可用于将匿名结构放入结构中的联合或匿名联合中。
例子:
你能解释一下如何使用这个联合?例如,如果我有u的实例x并使用'x.b1 ='a'',那么其余的b2,b3,b4会被初始化并占用内存空间吗? – Herbert
@Herbert与联合中的传统(命名)结构相同。你的问题实际上是关于包含结构的工会。你应该问它作为一个SO问题,而不是作为对更具体问题的答案的评论,但是由于你做了后者,'x.b1 ='a''不会初始化成员'b2','b3' ,'b4',但是这些会“占用内存空间”,这可以通过打印sizeof(union u)的值来看出。理论上,如果你声明一个'union u'变量,你只使用'b1'成员,一个足够聪明的编译器可能只为'b1'保留内存,... –
@Herbert,但是原则上声明一个'union u'对象意味着你可能想写入它后面包含的结构的任何成员,所以应该为它们保留内存。 –
的好处是很明显,不是吗?它节省了程序员的名字!由于naming things is hard,如果没有真正需要,可以避免这样做是很好的。
这也是一个非常明确的信号,这struct
是局部的,从来没有其他任何地方使用,但在被父结构,这是一个真正的现场,非常好的信息的情况下,因为它减少了不必要的耦合可能性 。
把它想象成static
;它将内部struct
的可见性限制为外部可见性,其方式类似于(但不等同于)static
如何限制全局符号对其出现的编译单元的可见性。
小小精心..静态??还有一个,如果那个是本地内部然后使用相同的名称的标识符给出错误..但在函数中,我们可以在{}中给予相同的名称标识符,因为块范围为什么不允许在这里结构{} – Omkant
'struct'变得如此局部,以至于很难理解程序员为什么不直接在父结构中内联其成员。目前版本中的这个答案没有列出关于该替代方案的任何好处。嵌套结构与内联成员(与更多的填充,这可能是预期的效果,但通常被认为是缺点)相比,布局是不同的。 –
由于上述原因,似乎匿名'联合'比匿名结构更有优势。 – sherrellbc
我只是跑进匿名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;
然后重新编译每一件事情。
所以现在所有这些日子的源代码审查和回归测试我都不高兴地期待不再需要。
我现在可以开始慢慢修改源代码的过程,使用这个全局代码将这个源代码更新到我自己的时间表上更现代的标准。
可能的重复[什么是在C11中有用的匿名结构和联合?](http://stackoverflow.com/questions/8932707/what-are-anonymous-structs-and-unions-useful-for-in- c11) –