的(signed)int的我有我的代码中定义了一个平台依赖型: typedef uint64_t myType;
printf和未知大小
但是在一些较为有限的平台,它可能是32位。
我该如何printf
呢? 在目前情况下,我可以使用%llu
,但是如果在另一个平台上它是32位,这不是最好的主意。
我想过使用一些宏,但谁会知道更好的方法?例如,我很想了解一些格式说明符,它们可以从下一个参数中获得长度。
的(signed)int的我有我的代码中定义了一个平台依赖型: typedef uint64_t myType;
printf和未知大小
但是在一些较为有限的平台,它可能是32位。
我该如何printf
呢? 在目前情况下,我可以使用%llu
,但是如果在另一个平台上它是32位,这不是最好的主意。
我想过使用一些宏,但谁会知道更好的方法?例如,我很想了解一些格式说明符,它们可以从下一个参数中获得长度。
既然你有特定于平台的类型,它应该是很容易使用特定于平台的格式字符串为好,这样的:
#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
中更有针对性的格式说明符,因为实现会为您的类型提供正确的格式说明。
或删除“%”,以便在调用printf时添加其他标志。 – immibis
好点,@immibis,做出了改变并添加了一个例子。 – paxdiablo
接受这个问题,它实际上也回答了打印平台相关类型的更广泛的问题。 – user1532080
只投它最多,规模最大,可能的整数类型的匹配所需的符号性和使用的格式为,或者:
printf("%jd", (intmax_t)x);
或:
printf("%ju", (uintmax_t)x);
(问题标题请求签署但身体正在使用未签名的例子,所以我已经涵盖了两个。)
这是比使用PRI*
宏建议少得多丑陋/更可读在另一个答案中,也适用于你自己不知道要使用的宏PRI
的类型,如off_t
。
我认为它应该是'uintmax_t' – Danh
问题标题说已签署,但正文说无符号。我会澄清。 –
我知道这不能回答你的问题。如果在某些平台上它将是32位,并且您知道它在这些平台上运行,您是否需要64位数字? –
定义printf格式说明符宏以及typedef –
另外,根据您使用的语言选择单一语言标记 –