R.A*_*tin 2 c unions language-lawyer
如果你有:
typedef union value {
int i;
float f;
} VALUE;
VALUE a, b;
Run Code Online (Sandbox Code Playgroud)
如果你知道a的类型,你应该这样做吗?
b.i = a.i;
b.f = a.f;
Run Code Online (Sandbox Code Playgroud)
要么
if(a_type == INT)
b.i = a.i;
if(a_type == FLOAT)
b.f = a.f;
Run Code Online (Sandbox Code Playgroud)
只是使用,b = a除非有特殊原因没有,例如联合偶尔包含大量数据,并且您希望在仅包含少量数据的情况下优化分配.
根据C 2011 [N1570] 6.5.16.1 1,简单分配的可接受情况之一是:
左操作数具有与右侧类型兼容的结构或联合类型的原子,限定或非限定版本.
按6.2.7 1:
如果类型相同,则两种类型具有兼容类型.
(根据6.2.6.1 6,"结构或联合对象的值永远不是陷阱表示,即使结构或联合对象的成员的值可能是陷阱表示.")