3 回答

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

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
為了回答最初的編譯時(shí)檢查問題,沒有一種標(biāo)準(zhǔn)化的方法可以在所有現(xiàn)有和將來的所有編譯器中使用,因?yàn)楝F(xiàn)有的C,C ++和POSIX標(biāo)準(zhǔn)都沒有定義用于檢測字節(jié)序的宏。
但是,如果您愿意將自己局限于某些已知的編譯器集,則可以查閱這些編譯器的每個(gè)文檔,以找出它們用于定義字節(jié)序的預(yù)定義宏(如果有)。 該頁面列出了您可以查找的幾個(gè)宏,因此下面的代碼適用于這些宏:
#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ù)定義宏,則也可以嘗試強(qiáng)制其吐出其預(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)
最后,要解決這個(gè)問題,Microsoft Visual C / C ++編譯器很奇怪,沒有上述任何內(nèi)容。幸運(yùn)的是,它們已經(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是一臺(tái)大端的PowerPC機(jī)器,因此,如果您要編寫跨平臺(tái)的庫標(biāo)頭,則可以輕松地進(jìn)行檢查_M_PPC。

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