我有这样的事情:
union DataXYZ
{
struct complex_t
{
float real, imag;
} complex;
struct vector_t
{
float magnitude, phase;
} vector;
};
Run Code Online (Sandbox Code Playgroud)
我有一些这些的向量,是通用工作区内存,我在语义上下文后相应地使用字段.
我知道,当最后一个活动成员是另一个字段(并且键入?)时,读取联合中的字段是未定义的行为.类型和布局完全匹配时,这是否重要?
我一直在评论其他一些类似的问题,要求提供保证行为的参考资料,但还没有出现 - 因此这个问题.
今天早上我和一位同事讨论了关于检测字节序的"编码技巧"的正确性.
诀窍是:
bool is_big_endian()
{
union
{
int i;
char c[sizeof(int)];
} foo;
foo.i = 1;
return (foo.c[0] == 1);
}
Run Code Online (Sandbox Code Playgroud)
对我来说,似乎这种用法union是不正确的,因为设置联合的一个成员并读取另一个成员的定义并不明确.但我必须承认,这只是一种感觉,我缺乏实际的证据来强化我的观点.
这个技巧是否正确?谁在这?
每当我看到联合的例子时,它们总是不同的类型.例如,来自MSDN:
// declaring_a_union.cpp
union DATATYPE // Declare union type
{
char ch;
int i;
long l;
float f;
double d;
} var1; // Optional declaration of union variable
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个联合(在这种情况下是匿名的,但这不重要)会发生什么,如下所示:
union
{
float m_1stVar;
float m_1stVarAlternateName;
};
Run Code Online (Sandbox Code Playgroud)
无论这是否是好的做法,这会导致任何问题吗?