对于联合,写入一个成员并从其他成员(除了char数组)读取是UB.
//snippet 1(testing for endianess):
union
{
int i;
char c[sizeof(int)];
} x;
x.i = 1; // writing to i
if(x.c[0] == 1) // reading from c[0]
{ printf("little-endian\n");
}
else
{ printf("big-endian\n");
}
//snippet 2(swap bytes using union):
int swapbytes()
{
union // assuming 32bit, sizeof(int)==4
{
int i;
char c[sizeof(int)];
} x;
x.i = 0x12345678; // writing to member i
SWAP(x.ch[0],x.ch[3]); // writing to char array elements
SWAP(x.ch[1],x.ch[2]); // writing to char array elements
return x.i; // reading from x.i
}
代码段1是合法的C或C但不是代码段2.我是否正确?有人可以指向标准部分,它表示可以写入union的成员并从另一个成员读取char数组.
解决方法:
我相信它(片段1)在技术上是不允许的,但大多数编译器都允许它,因为人们使用这种代码. GCC甚至证明它受到支持.
你会在sizeof(int)== 1的某些机器上遇到问题,并且可能在某些既不是big endian也不是little endian的机器上会出现问题.
使用可将单词更改为正确顺序的可用函数,或使用配置宏设置此函数.无论如何,您可能需要识别编译器和操作系统.