[英]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.h
為printf
提供了可移植的宏。 或者只使用C ++ I / O,然后您不必擔心printf
格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.