C语言 PRIu64 宏

时间:2025-02-10 11:52:06

问题

开发时遇到一个问题,同一份代码要分别编译跑在 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"
解决了这个问题。