3 回答

TA貢獻1842條經(jīng)驗 獲得超13個贊
這是用于編譯時檢查
您可以使用來自boost頭文件的信息,該文件endian.hpp涵蓋許多平臺。
編輯以進行運行時檢查
bool isLittleEndian()
{
short int number = 0x1;
char *numPtr = (char*)&number;
return (numPtr[0] == 1);
}
創(chuàng)建一個整數(shù),并讀取其第一個字節(jié)(最低有效字節(jié))。如果該字節(jié)為1,則系統(tǒng)為小端,否則為大端。
編輯思考
是的,您可能會在某些平臺(想不到)中遇到潛在問題sizeof(char) == sizeof(short int)。您可以使用可在中使用的固定寬度的多字節(jié)整數(shù)類型<stdint.h>,或者如果您的平臺不提供這種類型,則可以再次使用boost標(biāo)頭供您使用:stdint.hpp

TA貢獻1863條經(jīng)驗 獲得超2個贊
為了回答最初的編譯時檢查問題,沒有一種標(biāo)準(zhǔn)化的方法可以在所有現(xiàn)有和將來的所有編譯器中使用,因為現(xiàn)有的C,C ++和POSIX標(biāo)準(zhǔn)都沒有定義用于檢測字節(jié)序的宏。
但是,如果您愿意將自己局限于某些已知的編譯器集,則可以查閱這些編譯器的每個文檔,以找出它們用于定義字節(jié)序的預(yù)定義宏(如果有)。 該頁面列出了您可以查找的幾個宏,因此下面的代碼適用于這些宏:
#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || \
defined(__BIG_ENDIAN__) || \
defined(__ARMEB__) || \
defined(__THUMBEB__) || \
defined(__AARCH64EB__) || \
defined(_MIBSEB) || defined(__MIBSEB) || defined(__MIBSEB__)
// It's a big-endian target architecture
#elif defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN || \
defined(__LITTLE_ENDIAN__) || \
defined(__ARMEL__) || \
defined(__THUMBEL__) || \
defined(__AARCH64EL__) || \
defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__)
// It's a little-endian target architecture
#else
#error "I don't know what architecture this is!"
#endif
如果您無法從編譯器的文檔中找到編譯器使用的預(yù)定義宏,則也可以嘗試強制其吐出其預(yù)定義宏的完整列表,然后從那里猜測將起作用(使用ENDIAN,ORDER或處理器查找任何內(nèi)容)架構(gòu)名稱)。 本頁列出了許多在不同的編譯器中執(zhí)行此操作的方法:
Compiler C macros C++ macros
Clang/LLVM clang -dM -E -x c /dev/null clang++ -dM -E -x c++ /dev/null
GNU GCC/G++ gcc -dM -E -x c /dev/null g++ -dM -E -x c++ /dev/null
Hewlett-Packard C/aC++ cc -dM -E -x c /dev/null aCC -dM -E -x c++ /dev/null
IBM XL C/C++ xlc -qshowmacros -E /dev/null xlc++ -qshowmacros -E /dev/null
Intel ICC/ICPC icc -dM -E -x c /dev/null icpc -dM -E -x c++ /dev/null
Microsoft Visual Studio (none) (none)
Oracle Solaris Studio cc -xdumpmacros -E /dev/null CC -xdumpmacros -E /dev/null
Portland Group PGCC/PGCPP pgcc -dM -E (none)
最后,要解決這個問題,Microsoft Visual C / C ++編譯器很奇怪,沒有上述任何內(nèi)容。幸運的是,它們已經(jīng)在此處記錄了預(yù)定義的宏,您可以使用目標(biāo)處理器體系結(jié)構(gòu)來推斷字節(jié)序。盡管所有在Windows中目前支持的處理器是小端(_M_IX86,_M_X64,_M_IA64,和_M_ARM是小端),喜歡的PowerPC一些歷來支持處理器(_M_PPC)為大端。但更相關(guān)的是,Xbox 360是一臺大端的PowerPC機器,因此,如果您要編寫跨平臺的庫標(biāo)頭,則可以輕松地進行檢查_M_PPC。

TA貢獻1836條經(jīng)驗 獲得超13個贊
使用C99,您可以執(zhí)行以下檢查:
#define I_AM_LITTLE (((union { unsigned x; unsigned char c; }){1}).c)
類似的條件if (I_AM_LITTLE)將在編譯時進行評估,并允許編譯器優(yōu)化整個塊。
對于這是否嚴(yán)格來說是C99中的一個常數(shù)表達(dá)式(這將使它可以用于靜態(tài)存儲持續(xù)時間數(shù)據(jù)的初始化程序),我沒有合適的參考資料,但是如果沒有,這是下一個最好的選擇。
- 3 回答
- 0 關(guān)注
- 841 瀏覽
添加回答
舉報