我已經在這個主題上提到了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