【发布时间】:2011-09-02 10:07:39
【问题描述】:
今天早上我与一位同事讨论了检测字节顺序的“编码技巧”的正确性。
诀窍是:
bool is_big_endian()
{
union
{
int i;
char c[sizeof(int)];
} foo;
foo.i = 1;
return (foo.c[0] == 1);
}
对我来说,union 的这种用法似乎是不正确的,因为设置一个联合成员并读取另一个成员没有明确定义。但我不得不承认,这只是一种感觉,我缺乏实际的证据来加强我的观点。
这个技巧正确吗?谁在这里?
【问题讨论】:
-
至少 gcc 的人推荐这个用于类型双关语而不是强制转换为另一种类型,这更不明确:-)
-
@drhirsch:我同意。但如果只是变相的演员表,难道不应该一样糟糕吗?
-
这不仅仅是伪装的演员。它具有关于联合元素的内存位置的更精确的语义作为简单的强制转换。更多关于 gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/…
-
确实,你永远不会得到一个完全定义的解决方案来解决这样的废话:P
-
#define BIG_ENDIAN不是比这更容易吗?无论如何,您仍然必须在大多数系统上检测操作系统和其他东西。
标签: c++ standards endianness unions