第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在編譯時(shí)確定字節(jié)序

在編譯時(shí)確定字節(jié)序

C
繁華開滿天機(jī) 2019-11-15 21:12:54
有沒有一種安全,可移植的方法來確定(在編譯期間)要在其上編譯程序的平臺(tái)的字節(jié)順序?我正在用C寫作。[EDIT]感謝您的回答,我決定堅(jiān)持使用運(yùn)行時(shí)解決方案!
查看完整描述

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


查看完整回答
反對(duì) 回復(fù) 2019-11-15
?
小唯快跑啊

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。


查看完整回答
反對(duì) 回復(fù) 2019-11-15
?
開心每一天1111

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è)最好的選擇。


查看完整回答
反對(duì) 回復(fù) 2019-11-15
  • 3 回答
  • 0 關(guān)注
  • 831 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)