我们在工作中遇到了一个问题,我们无法使用<inttypes.h>(PRIx64) 中的“可移植”类型来正确打印十六进制格式的 64 位无符号整数。
uint64_t serial = 0x12345678;
usb_printf("Serial: %"PRIx64"\n", serial);
Run Code Online (Sandbox Code Playgroud)
在哪里
void usb_printf(const char *fmt, ...)
{
char string[512];
uint16_t string_length = 0;
va_list va;
va_start(va, fmt);
string_length = vsnprintf(string, ARRAY_SIZE(string), fmt, va);
bsp_usb_cdc_send_buf((uint8_t *)string, string_length);
va_end(va);
}
Run Code Online (Sandbox Code Playgroud)
给出
> Serial: lx
Run Code Online (Sandbox Code Playgroud)
它在 LPC55S28 (Cortex-M33) 上运行,并-specs=nosys.specs -specs=nano.specs使用 GCC 链接。
通过查看 PRIx64 定义,它似乎被定义为:
#define __INT64 "ll"
#define __PRI64(x) __INT64 __STRINGIFY(x)
#define PRIx64 __PRI64(x)
Run Code Online (Sandbox Code Playgroud)
为什么可PRIx64移植类型定义在此平台上的行为不符合人们的预期?