【问题标题】:Good introduction to <inttypes.h> [closed]<inttypes.h> 的良好介绍 [关闭]
【发布时间】:2011-09-12 01:29:15
【问题描述】:

我想向使用混合 32/64 位构建的 printf 推荐使用 &lt;inttypes.h&gt;。我尝试在 Google 上搜索包含一些示例和使用指南的介绍或教程页面,但找不到。

有人可以推荐&lt;inttypes.h&gt;的介绍或教程吗?

【问题讨论】:

  • “混合 32/64 位构建”到底是什么意思。是否会期望用户使用来自stdint.h 的“固定大小”类型?埃德温的回答中是否有什么特别缺乏的东西导致了赏金的增加?
  • @Michael:是的,当您在 LP64 下使用已知宽度的整数类型(如int64_t)时,就会出现问题,其中对应于long。在这种情况下,正确的格式说明符是%ld,但如果您构建在对应于long long 的32 位系统上,那么您需要%lld。我希望有一个既能激发使用&lt;inttypes.h&gt; 的描述(正如我在此评论中简要做的那样)并提供示例。我可以指出一些事情,以免自己不得不解释原因和方法。

标签: c printf c99


【解决方案1】:

先试试http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html

avr-libc 中找到了如何使用新的可移植格式宏的更好示例。我已经包含了一个示例(来自链接)来说明。 QNX libraries 也有更好的人类可读描述(如果您不喜欢冷淡地阅读规范),尽管您必须滚动到页面末尾才能看到描述的核心。

#include <inttypes.h>

uint8_t smallval;
int32_t longval;
...
printf("The hexadecimal value of smallval is %" PRIx8
       ", the decimal value of longval is %" PRId32 ".\n",
       smallval, longval);

请注意,这使用“String”“String”隐含的连接运算符来产生字符串(在本例中)

"The hexadecimal value of smallval is %x, the decimal value of longval is %ld.\n"

尝试分解命名约定似乎表明:

  • (前三个字母)
    • 用于 printf 格式的 PRI
    • scanf 格式的 SCN
  • (第四个字母)
    • x 表示十六进制格式
    • u 用于无符号格式
    • o 用于八进制格式
    • i 用于整数格式
    • d 用于十进制格式
  • (额外的字母)
    • 8 位 8 位
    • 16 位为 16 位
    • 32 表示三十二位
    • 64 表示 64 位
    • FAST8 用于“快速”八位
    • FAST16 用于“快速”16 位
    • FAST32 用于“快速”三十二位
    • FAST64 用于“快速”六十四位
    • LEAST8 表示“最少”八位
    • LEAST16 表示“最小”十六位
    • LEAST32 表示“最小”三十二位
    • LEAST64 表示“最少”六十四位
    • 指针的 PTR
    • 最大支持位大小

so PRIx8 表示 printf 格式指令格式化为十六进制八位。

【讨论】:

  • 啊,将字符串文字并排放置是多么有用啊。
  • PTR 用于指针大小的 整数 (size_t,intptr_t,ptrdiff_t),而不是指针。在我的至少一个平台 (OSX) 上,使用带有 void* 的 PRIxPTR 时出现错误。使用 %p 作为指针。
  • @RickBerge:请注意,严格来说,PTR 宏适用于intptr_tuintptr_t; C99 和 C11 标准定义了格式修饰符 z 以指定 size_t 参数(例如 "%zu"),并且它们定义 t 以指定 ptrdiff_t(例如 "%td") .
【解决方案2】:

对于这些事情,我总是遵循标准 (PDF link);一旦你弄清楚它们的设置模式,它们就不会太复杂。相关部分是§7.8 整数类型的格式转换&lt;inttypes.h&gt;

【讨论】:

    【解决方案3】:

    HP 对编写可移植代码有很好的参考,他们给出了一些使用 inttypes.h 的具体建议

    Writing Portable Code

    【讨论】:

      【解决方案4】:

      我总是从*开始查找标题。 &lt;inttypes.h&gt; 在 Wikipedia 上似乎很成问题。然后我将采取的下一步是去this site。这个以前的网站列出了每个宏并给出了一个例子。您还可以查看this site,它实际上向您显示了头文件。我认为这些都不是真正的教程,但它们是一个很好的起点。

      【讨论】:

      • 最后2个链接是一样的(大部分只是宏列表)