【发布时间】:2015-07-26 22:19:52
【问题描述】:
问题是在一个平台(windows,mvsc2015)uint64_t 被定义为 unsigned long long 而在另一个(ubuntu,clang)它是 unsigned long 并且代码看起来像
sprintf(buffer, "%#llx", u64key);
【问题讨论】:
问题是在一个平台(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)。然而,这可能不适用于大多数/所有版本的 MSVC 标准库实现,因为它们在标准一致性方面远远落后。
【讨论】:
x*3 + 1,否则您绝对无法编写代码?
inttypes.h,您可以包含stdint.h,它可能会有。但是,OP 没有指定 MSVC 版本,因此,因为它是 2015 年,我们必须假设一个实现了大部分 C99 的版本。请注意,该问题假设 uint64_t 可以从某处甚至在 MSVC 上使用。
uint64_t。那你为什么要担心打印一个呢? i.imgur.com/x6AnRkL.png?fb
intmax_t 已添加到 C99,这也需要 inttypes.h。那么,如果编译器不支持 C99,如何假设它提供了intmax_t 和相应的格式说明符?请注意intmax_t 本身在stdint.h 中的定义与int32_t 和朋友一样多。
您可以使用预处理器指令来检测数据类型的定义方式并使用不同的字符串编译另一个 sprintf()。
【讨论】: