<inttypes.h>的好介绍

Ben*_*son 27 c printf c99

我想建议使用的<inttypes.h>做给别人printf用混合32/64位版本.我尝试了谷歌的介绍或教程页面,其中包含一些示例和使用指南,但我找不到一个.

有人可以推荐一个介绍或教程<inttypes.h>吗?

Edw*_*uck 42

尝试http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html开始.

avr-libc中找到了如何使用新的可移植格式化宏的更好示例.我已经包含了一个例子(来自链接)来说明. QNX库也有一个更好的人类可读的描述(如果你不喜欢阅读规范冷),虽然你必须滚动几乎到页面的末尾,以了解描述的内容.

#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);
Run Code Online (Sandbox Code Playgroud)

请注意,这使用"String""String"隐含连接运算符来生成字符串(在此示例中)

"The hexadecimal value of smallval is %x, the decimal value of longval is %ld.\n"
Run Code Online (Sandbox Code Playgroud)

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

  • (前三个字母)
    • printf格式的PRI
    • 扫描格式的SCN
  • (第四封信)
    • x表示十六进制格式
    • 你的无符号格式
    • o用于八进制格式化
    • 我用于整数格式化
    • d表示十进制格式
  • (额外的字母)
    • 8位8位
    • 16比16
    • 三十二位32
    • 六十四位64
    • FAST8为"快速"8位
    • FAST16为"快速"16位
    • FAST32为"快"三十二位
    • FAST64为"快"六十四位
    • LEAST8为"最少"八位
    • 至少16位的LEAST16
    • LEAST32为"至少"三十二位
    • LEAST64为"至少"六十四位
    • 指针的PTR
    • MAX表示支持的最大位数

所以PRIx8意味着printf格式指令格式化为十六进制八位.

  • PTR用于指针大小的_integers_(size_t,intptr_t,ptrdiff_t),而不是指针.在我的至少一个平台(OSX)上,使用带有void*的PRIxPTR时出错.使用%p作为指针. (2认同)

Car*_*rum 7

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