同时研究如何做到的交叉平台 printf() 格式串C(即,考虑到数位我希望每个整数参数 printf() 应该是)我跑过 这部分的维基百科上的文章 printf().该文讨论了非标准选项,可以通过来 printf() 格式串,例如(什么似乎是Microsoft具体的扩展):

printf("%I32d\n", my32bitInt);

它接着说:

ISO C99包括inttypes.h头 文件,包括一些宏 用于独立于平台的printf 编码。

...然后列出了一组宏可以找到所述的标题。看看标题文件,利用他们我会写:

 printf("%"PRId32"\n", my32bitInt);

我的问题是:我失去了一些东西?这是真正的标准C99的方式来做到这一点?如果是这样,为什么?(虽然我并不感到惊讶,我从来没有见过代码使用的格式串这种方式,因为它似乎很麻烦的...)

有帮助吗?

解决方案

在C原理似乎暗示还正在标准化现有做法:

  

<强> 从同一个名字的几个现有的64位系统中的报头的。

但本文的其余不写这些宏,我不记得他们在当时现行的做法。

以下是只是猜测,而是由标准化委员会如何运作经验的教育。

C99的宏超过了printf的标准化附加格式说明的一个优点(注意,C99也确实添加了一些)是提供<inttypes.h><stdint.h>当你已经拥有支持在实现特有的方式所需要的功能的实现仅仅是写两个有足够的typedef和宏文件。减少使现有的实施符合性的成本,减少打破这使得利用现有的实现细节的功能(标准方式不会干扰),现有方案的风险和促进符合性计划的实施移植没有这些谁标题(它们可以通过程序来提供)。此外,如果执行特定方式已经在时间而变化,它不favorize一个实现对另一

其他提示

正确的,这是C99的标准怎么说,你应该使用它们。如果你想真正portablt代码是100个%符合标准的信,你应该使用int"%d"使用int32_t始终打印"%"PRId32

大多数人不会理会,不过,因为有极少数情况下,如果不这样做会事宜。除非你移植你的代码的Win16或DOS,你可以假设sizeof(int32_t) <= sizeof(int),所以它是无害的意外的printf的int32_t作为int。同样地,long long是非常普遍64位(尽管它不能保证是这样),所以印刷int64_t作为long long(例如用%llx说明符)是安全的。

类型int_fast32_tint_least32_t等人的很少使用,所以可以想像,其相应的格式说明更很少使用。

可以总是向上铸造并使用%jd这是intmax_t格式说明。

printf("%jd\n", (intmax_t)(-2));

我用intmax_t表明任何intXX_t可以使用,而是简单地投射到long是多的情况下int32_t更好,然后使用%ld

我只能猜测为什么。我喜欢AProgrammer是以上的答案,但有一个方面被忽视: 什么你是要添加到printf作为一格式的修饰? 已经有两个不同的方式,数字是用于printf format string(宽度和精确度).添加第三种编号,以说有多少位的精确度都在争论将是巨大的,但你要把它没有令人困惑的人民?Unfortunatey的一个缺陷C是,printf不是设计为可可扩展的。

宏都是可怕的,但是当你需要编写代码,是便携式的跨越32位和64位平台,它们是天赐良机。绝对救了我的熏肉。

我想回答你的问题 为什么 是么

  • 没有人能想到一个更好的方式来做到这一点,或
  • 该准则委员会不能同意任何他们认为显然更好。

另一种可能性:向后兼容。如果添加了更多格式说明printf,或其他选项,可以在某些C99预代码的说明符将有一个格式字符串有不同的解释。

随着C99的变化,你不改变printf的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top