【发布时间】:2017-02-07 09:13:44
【问题描述】:
我在 SO 中提到了很多关于这个主题的问题,但到目前为止找不到任何解决方案。这里提到了一种自然的解决方案:Determining endianness at compile time.
但是,cmets中提到的相关问题&相同的答案。
经过一些修改,我可以使用 g++ 和 clang++ (-std=c++11) 编译类似的解决方案,而不会发出任何警告。
static_assert(sizeof(char) == 1, "sizeof(char) != 1");
union U1
{
int i;
char c[sizeof(int)];
};
union U2
{
char c[sizeof(int)];
int i;
};
constexpr U1 u1 = {1};
constexpr U2 u2 = {{1}};
constexpr bool IsLittleEndian ()
{
return u1.i == u2.c[0]; // ignore different type comparison
}
static_assert(IsLittleEndian(), "The machine is BIG endian");
Demo.
这可以被认为是确定字节序的确定性方法还是错过了类型双关或其他什么?
【问题讨论】:
-
uint8_t(u2.i)不会在任一字节序上产生相同的值吗?强制转换应该是保值的,而不仅仅是选择第一个字节。 -
一个 4 字节整数中有 24 种可能的字节顺序。 至少三个已被真正的计算机使用。此外,不完全清楚授予 [[
un]signed]char的严格别名规则的例外适用于uint8_t。 -
我相信如果你真的在大端机器上运行它,它仍然会测试
1 == 1并返回true。 -
sizeof(char) == 1根据定义为真。sizeof以char的单位给出, 所以这个断言实际上永远不会失败。
标签: c++ c++11 endianness compile-time type-punning