为什么不是新的(特定于位宽)printf()格式选项字符串作为C99的一部分?

mpo*_*llo 17 c printf types c99 format-specifiers

在研究如何printf()在C中执行跨平台格式字符串时(也就是说,考虑到我希望每个整数参数printf()应该是的位数),我在维基百科文章的这一部分中进行了讨论printf().本文讨论了可以传递给printf()格式化字符串的非标准选项,例如(似乎是特定于Microsoft的扩展):

printf("%I32d\n", my32bitInt);
Run Code Online (Sandbox Code Playgroud)

它接着说:

ISO C99包括inttypes.h头文件,其中包含许多用于独立于平台的printf编码的宏.

...然后列出一组可在所述标题中找到的宏.查看头文件,使用它们我必须写:

 printf("%"PRId32"\n", my32bitInt);
Run Code Online (Sandbox Code Playgroud)

我的问题是:我错过了什么吗?这真的是标准的C99方式吗?如果是这样,为什么?(虽然我从未见过以这种方式使用格式字符串的代码并不感到惊讶,因为它看起来很麻烦......)

APr*_*mer 16

C原理似乎暗示<inttypes.h>正在标准化现有实践:

<inttypes.h>派生自几个现有64位系统上的同名头.

但是文本的其余部分没有写关于那些宏,我不记得他们当时是现有的做法.

接下来的内容只是猜测,但是受到标准化委员会工作经验的教育.

C99宏的一个优点是标准化printf的附加格式说明符(注意C99也添加了一些)是提供<inttypes.h><stdint.h>当你已经有一个实现支持特定实现方式所需的功能时,只需编写两个具有足够typedef和宏.这降低了使现有实现符合要求的成本,降低了破坏现有程序的风险,这些程序利用了现有的实现细节功能(标准方式不会干扰),并便于将符合性程序移植到没有这些功能的实现中标题(它们可以由程序提供).另外,如果当时实现特定的方式已经变化,那么它不会优先于另一个实现.


Ada*_*eld 8

正确,这就是C99标准所说你应该使用它们的方式.如果您想要真正符合该字母100%标准的portablt代码,则应始终打印int使用"%d"int32_t使用"%"PRId32.

但是,大多数人都不会打扰,因为很少有人不这样做会很重要.除非你将你的代码移植到Win16或DOS,否则你可以认为sizeof(int32_t) <= sizeof(int),所以不小心将printf打成了int32_t一个int.同样,a long long几乎普遍是64位(尽管不能保证这样),因此打印int64_t一个long long(例如使用%llx说明符)也是安全的.

几乎没有使用过类型int_fast32_t,int_least32_t因此您可以想象它们相应的格式说明符更少使用.