是否有可能在任何架构上使用任何编译器使以下断言失败?
union { int x; int y; } u;
u.x = 19;
assert(u.x == u.y);
Run Code Online (Sandbox Code Playgroud)
C99对一个联合的两个成员是共享初始字段序列的结构的情况做出特殊保证:
struct X {int a; /* other fields may follow */ };
struct Y {int a; /* other fields may follow */ };
union {X x; Y y;} u;
u.x.a = 19;
assert(u.x.a == u.y.a); // Guaranteed never to fail by 6.5.2.3-5.
Run Code Online (Sandbox Code Playgroud)
6.5.2.3-5:为了简化联合的使用,我们做了一个特殊的保证:如果一个联合包含几个共享一个共同初始序列的结构(见下文),并且如果联合对象当前包含这些结构中的一个,那么允许在任何可以看到完整类型的联合声明的地方检查其中任何一个的共同初始部分.如果对应的成员具有一个或多个初始成员的序列的兼容类型(并且对于位字段,具有相同的宽度),则两个结构共享共同的初始序列.
但是,我无法为联盟内的非结构化类型找到可比较的保证.但这很可能是一个遗漏:如果标准花了一些长度来描述结构类型必然会发生什么,甚至不相同,它应该澄清更简单的非结构化类型的相同点.
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |