我的代码中定义了一个依赖于平台的类型:
typedef uint64_t myType;
然而,在一些更有限的平台上,它可能是32位。
我如何printf
它?
在目前的情况下,我可以使用%llu
,但如果在另一个平台上它是32位,这不是最好的主意。
我想过使用一些宏,但有人会知道更好的方法吗?我很想知道一些格式说明符,例如可以从下一个参数中获取长度。
答案 0 :(得分: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
中更具针对性的格式说明符,因为实现将为您的类型提供正确的格式说明符
答案 1 :(得分:4)
只需将其转换为与所需签名匹配的最大可能整数类型,并使用其格式:
printf("%jd", (intmax_t)x);
或:
printf("%ju", (uintmax_t)x);
(问题标题要求签名,但正文使用未签名的示例,所以我已经涵盖了两者。)
这比使用其他答案中建议的PRI*
宏更难看/更易读,并且适用于您本身并不知道要使用的正确PRI
宏的类型,比如off_t
。