将 uint_64_t 错误地传递给 va_list

问题描述

我正在编写一个自定义printf 函数,而 uint64_t 似乎被错误地传递给了 va_list

问题点:

printf("Number is %C,and the next one is %C",0xff00ffb7,0xffffffff);

我的 printf 实现的一部分产生了错误的结果:

format++;
uint64_t num = va_arg(parameters,uint64_t);

当使用 gdb 调试时,num 的值变为 0xffffffffff00ffb7 而不是我期望的 0xff00ffb7,并且对于下一个 %C num 变为 0。是这是我遗漏的一些标准行为还是我做错了什么?

解决方法

如果 0xff00ffb7 是可变参数函数的 uint64_t,则将其强制转换。

printf("Number is %C",(uint64_t) 0xff00ffb7);

0xff00ffb7 作为整数常量,具有 int,unsigned,long,unsigned long,long longunsigned long long 类型:它“适合”的第一个。对于 32 位 int/unsigned0xff00ffb7 将是 unsigned,并且可能是 OP 麻烦的根源。

u 附加到常量是一个主意,以确保它是某种无符号类型。

LLL 附加到常量并不是确保常量为 uint64_t 的好主意。要么可能匹配(LL 经常会),但这些后缀并不能保证该类型。

使用 UINT64_C(0xff00ffb7) 形成类型为 uint_least64_t 的常量,它肯定与具有 uint64_t 的机器上的 uint64_t 相同。