簡體   English   中英

你如何處理在平台之間切換的整數的原生大小?

[英]How do you deal with the native size of integers changing between platforms?

我擔心我已經知道答案,但我想確定......

我有一個相當大的項目,其頭文件類型為typedefs native types:

typedef unsigned long int    u32;
typedef signed long int      s32;
// etc...

不可避免的事情發生了,我現在正在嘗試編譯一個long 64位而不是32位的系統。修復它的最佳方法是什么?

typedef上面用int (或int32_t / uint32_t從stdint.h),這將滿足於我所知道的,但這似乎仍值得懷疑平台的32位大小。 printf樣式函數也存在問題,其中使用了%ld (編譯器抱怨並希望看到%d )。 這些都必須改變,不是它們(也許是inttypes.h中的定義)?

這似乎很簡單但我想在開始深入研究之前確定(修復printf格式字符串似乎令人生畏)。

C有<stdint.h> ,在C ++ 0x中是<cstdint> 對於非C ++ 0x編譯器,如果您不介意依賴Boost,則需要<boost/cstdint.hpp> <inttypes.h>頭文件還包含printf()格式說明符的宏,可以適用於 <cstdint>類型。 如果您使用的是C ++,則應使用<iostream> ,因此無需擔心類型化格式說明符。

創建一個與您的庫/可執行文件一起編譯的單個翻譯(.cpp)。 在其中,使用靜態斷言。 如果您需要特定的大小,這種方法可以確認您的聲明是否符合您在創建可鏈接/可執行二進制文件之前需要匹配的條件,如果環境發生變化。

然后打開編譯器警告並修復必須修復的問題。

關於便攜式32位整數(等)的解決方案:

  • 在一些手工構建的配置文件中定義您自己的可移植類型
  • 使用stdint.h可以為您執行此操作,並保證在任何甚至接近C99兼容的C編譯器中都可以使用。

printf而言, stdint.hprintf提供了可移植的宏。 或者只使用C ++ I / O,然后您不必擔心printf格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM