【问题标题】:Format specifier to portably print std::uint64_t variable in C++11格式说明符以在 C++11 中可移植地打印 std::uint64_t 变量
【发布时间】:2019-05-16 16:23:06
【问题描述】:

在 C++ 中使用 std::printf() 系列中的函数打印 std::uint64_t(来自 <cstdint>)类型的值的格式说明符是什么?

C99 有 PRIu64(来自 <inttypes.h>),但我并不完全清楚 PRIu64 是有效的 C++11,尽管我可以找到它可能是的提示。

没有PRIu64,据我所知,没有单一的格式说明符适用于所有情况:

  • 在 32 位平台上,std::uint64_t 将被定义为 unsigned long long,格式说明符将是 %llu
  • 在 64 位平台上,std::uint64_t 将定义为 unsigned long,格式说明符将是 %lu
  • 但是对于 Visual Studio,%llu 在这两种情况下都有效。

【问题讨论】:

  • 在 64 位平台上,std::uint64_t 将被定义为 unsigned long,格式说明符将为 %lu。 这仅适用于 *nix 系统. Windows 在 64 位系统中仍然使用 32 位长。
  • <cinttypes> 如果我没记错的话也应该有那个宏。编辑:cppreference 验证它。
  • @NathanOliver 确实,因为 Windows 是 LLP64,因此为什么 %llu 始终是 Visual Studio 的正确说明符。
  • @rustyx 我发布这个问题正是因为%llu 并不总是有效。
  • 可能相关,甚至可能被骗:stackoverflow.com/questions/8132399/…

标签: c++ c++11 printf portability


【解决方案1】:

PRIu64 仍然是您将在 C++ 中使用的内容。每[cinttypes.syn]PRIu64

[...]

#define PRIuN see below

[...]

头文件<cinttypes>的内容和含义与C标准库头文件<inttypes.h>相同[...]

因此它存在并且具有与 C ISO/IEC 9899:2011 标准中相同的行为。

【讨论】:

    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2023-03-20
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多