我已经在这个主题上提到了SO中的许多问题,但到目前为止找不到任何解决方案。这里提到了一个自然的解决方案:Determining endianness at compile time。
但是,在评论&中提到的相关问题的答案相同。在编译时使用C++编程式地查找字节序列号11
经过一些修改,我可以用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。
这可以被认为是一个确定性的方法来决定endian - ness或错过类型双关或其他?
uint8_t(u2.i)'不会在任何字节序上产生相同的值吗?强制转换应该是值得保留的,而不仅仅是选择第一个字节。 –
在4字节整数内有24个可能的字节顺序。至少*三台电脑已被实际电脑使用。此外,对[['un']'signed']'char'的严格别名规则的例外情况也适用于'uint8_t'并不完全清楚。 –
@BoPersson,我想避免任何有关“不同大小类型比较”的编译器警告(正如我在Q中声称的那样)。从这里开始,1会用最小的类型表示,我发现它可以用于类型转换。或者我误解了你的担忧?我会修改一下代码。 – iammilind