【问题标题】:Is there a way to fix format specifiers warnings for stdint types?有没有办法修复 stdint 类型的格式说明符警告?
【发布时间】:2015-07-26 22:19:52
【问题描述】:

问题是在一个平台(windows,mvsc2015)uint64_t 被定义为 unsigned long long 而在另一个(ubuntu,clang)它是 unsigned long 并且代码看起来像 sprintf(buffer, "%#llx", u64key);

【问题讨论】:

    标签: c printf typedef stdint


    【解决方案1】:

    解决方案是使用 C99 的格式宏,特别是 PRIu64 用于 uint64_t

    #include <inttypes.h>
    …
    sprintf(buffer, "%#" PRIu64 "\n", u64key);
    

    【讨论】:

      【解决方案2】:

      Pascal 的解决方案是这种特定类型最直接和最惯用的解决方案,但为了记录,打印您不知道其定义的任意整数类型的替代方法是简单地转换为 intmax_tuintmax_t 然后使用j 修饰符(例如 %jd%ju)。然而,这可能不适用于大多数/所有版本的 MSVC 标准库实现,因为它们在标准一致性方面远远落后。

      【讨论】:

      • @melpomene 缺少示例。
      • @WeatherVane 认真的吗?如果有人告诉您“将 x 乘以 3,然后加 1”,您是否还会要求提供示例,因为除非您可以从 SO 复制/粘贴 x*3 + 1,否则您绝对无法编写代码?
      • @WeatherVane 如果您的编译器没有inttypes.h,您可以包含stdint.h,它可能会有。但是,OP 没有指定 MSVC 版本,因此,因为它是 2015 年,我们必须假设一个实现了大部分 C99 的版本。请注意,该问题假设 uint64_t 可以从某处甚至在 MSVC 上使用。
      • @WeatherVane ...所以你首先没有uint64_t。那你为什么要担心打印一个呢? i.imgur.com/x6AnRkL.png?fb
      • IIRC,intmax_t 已添加到 C99,这也需要 inttypes.h。那么,如果编译器不支持 C99,如何假设它提供了intmax_t 和相应的格式说明符?请注意intmax_t 本身在stdint.h 中的定义与int32_t 和朋友一样多。
      【解决方案3】:

      您可以使用预处理器指令来检测数据类型的定义方式并使用不同的字符串编译另一个 sprintf()。

      【讨论】:

      • “使用预处理器指令来检测数据类型是如何定义的” - ... 如何?
      猜你喜欢
      • 2018-10-30
      • 1970-01-01
      • 2018-01-09
      • 2021-10-06
      • 1970-01-01
      • 2021-12-08
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多