问题
开发时遇到一个问题,同一份代码要分别编译跑在 32 位和 64 位 CPU 上,部分代码如下
uint64_t a;
char a_str[20] = {0};
a = 0x1234;
sprintf(a_str, "%llu", a);
使用 64 位编译器,编译报警告:uint64_t 是 long unsigned int 类型,请使用 "%ld"
。
然后改成 “%ld”,使用 32 位机器编译时,又报警告了:uint64_t 是 long long unsigned int 类型,请使用 "%lld"
。
两者不能得兼?
解决
后来查到可以使用 PRIu64 宏,即代码改为如下:
uint64_t a;
char a_str[20] = {0};
a = 0x1234;
sprintf(a_str, "%"PRIu64, a);
两种编译器都不报警告了。
探究
PRIu64 的定义在 头文件里。
# if __WORDSIZE == 64
# define __PRI64_PREFIX "l"
# else
# define __PRI64_PREFIX "ll"
# endif
# define PRIu64 __PRI64_PREFIX "u"
可以看到,
32 位编译器,会把 "%"PRIu64
扩展为 "%lld"
,
64 位编译器,会把 "%"PRIu64
扩展为 "%ld"
,
解决了这个问题。