2016-11-11 54 views
1

的(signed)int的我有我的代碼中定義了一個平臺依賴型: typedef uint64_t myType;printf和未知大小

但是在一些較爲有限的平臺,它可能是32位。

我該如何printf呢? 在目前情況下,我可以使用%llu,但是如果在另一個平臺上它是32位,這不是最好的主意。

我想過使用一些宏,但誰會知道更好的方法?例如,我很想了解一些格式說明符,它們可以從下一個參數中獲得長度。

+0

我知道這不能回答你的問題。如果在某些平臺上它將是32位,並且您知道它在這些平臺上運行,您是否需要64位數字? –

+5

定義printf格式說明符宏以及typedef –

+2

另外,根據您使用的語言選擇單一語言標記 –

回答

5

既然你有特定於平臺的類型,它應該是很容易使用特定於平臺的格式字符串爲好,這樣的:

#ifdef USING_64_bits 
    typedef uint64_t myType; 
    #define MY_TYPE_FMT PRIu64 
#else 
    typedef uint32_t myType; 
    #define MY_TYPE_FMT PRIu32 
#endif 

然後你可以使用它:

myType var1 = 42, var2 = 99; 
printf ("%6" MY_TYPE_FMT ", %019" MY_TYPE_FMT "\n", var1, var2); 

從格式字符串中提取%允許您動態插入其他格式說明符,例如字段寬度和填充字符。

您還會注意到我已經避免了%llu風格的格式說明符,您應該使用inttypes.h中更有針對性的格式說明符,因爲實現會爲您的類型提供正確的格式說明。

+0

或刪除「%」,以便在調用printf時添加其他標誌。 – immibis

+0

好點,@immibis,做出了改變並添加了一個例子。 – paxdiablo

+0

接受這個問題,它實際上也回答了打印平臺相關類型的更廣泛的問題。 – user1532080

4

只投它最多,規模最大,可能的整數類型的匹配所需的符號性和使用的格式爲,或者:

printf("%jd", (intmax_t)x); 

或:

printf("%ju", (uintmax_t)x); 

(問題標題請求籤署但身體正在使用未簽名的例子,所以我已經涵蓋了兩個。)

這是比使用PRI*宏建議少得多醜陋/更可讀在另一個答案中,也適用於你自己不知道要使用的宏PRI的類型,如off_t

+1

我認爲它應該是'uintmax_t' – Danh

+0

問題標題說已簽署,但正文說無符號​​。我會澄清。 –