有没有办法修复 stdint 类型的格式说明符警告?
Is there a way to fix format specifiers warnings for stdint types?
问题是在一个平台上 (windows, mvsc2015) uint64_t
被定义为 unsigned long long
而在另一个平台 (ubuntu, clang) 上它是 unsigned long
并且有看起来像的代码
sprintf(buffer, "%#llx", u64key);
解决方案是使用 C99 的格式宏,特别是 PRIu64
用于 uint64_t
:
#include <inttypes.h>
…
sprintf(buffer, "%#" PRIu64 "\n", u64key);
Pascal 的解决方案对于这种特定类型是最直接和最惯用的解决方案,但为了记录,打印您不知道其定义的任意整数类型的替代方法是简单地转换为 intmax_t
或 uintmax_t
然后使用 j
修饰符(例如 %jd
或 %ju
)。但是,这可能不适用于 most/all 版本的 MSVC 标准库实现,因为它们在标准一致性方面远远落后。
您可以使用预处理器指令来检测数据类型的定义方式并使用不同的字符串编译另一个 sprintf()。
问题是在一个平台上 (windows, mvsc2015) uint64_t
被定义为 unsigned long long
而在另一个平台 (ubuntu, clang) 上它是 unsigned long
并且有看起来像的代码
sprintf(buffer, "%#llx", u64key);
解决方案是使用 C99 的格式宏,特别是 PRIu64
用于 uint64_t
:
#include <inttypes.h>
…
sprintf(buffer, "%#" PRIu64 "\n", u64key);
Pascal 的解决方案对于这种特定类型是最直接和最惯用的解决方案,但为了记录,打印您不知道其定义的任意整数类型的替代方法是简单地转换为 intmax_t
或 uintmax_t
然后使用 j
修饰符(例如 %jd
或 %ju
)。但是,这可能不适用于 most/all 版本的 MSVC 标准库实现,因为它们在标准一致性方面远远落后。
您可以使用预处理器指令来检测数据类型的定义方式并使用不同的字符串编译另一个 sprintf()。