当前位置 博文首页 > lyndon:C语言 PRIu64 宏

    lyndon:C语言 PRIu64 宏

    作者:[db:作者] 时间:2021-09-15 10:18

    问题

    开发时遇到一个问题,同一份代码要分别编译跑在 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 的定义在 inttypes.h 头文件里。

    # if __WORDSIZE == 64
    #  define __PRI64_PREFIX	"l"
    # else
    #  define __PRI64_PREFIX	"ll"
    # endif
    
    # define PRIu64		__PRI64_PREFIX "u"
    

    可以看到,
    32 位编译器,会把 "%"PRIu64 扩展为 "%lld"
    64 位编译器,会把 "%"PRIu64 扩展为 "%ld"
    解决了这个问题。

    cs
    下一篇:没有了