2016-11-11 78 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

问题标题说已签署,但正文说无符号​​。我会澄清。 –