14.5 inttypes.h(C99)
从某种意义上来说,“inttypes.h”是C99对“stdio.h”和“stdlib.h”的补充,或者你也可以把它理解为关于扩展整数类型的“stdio.h”和“stdlib.h”。理由是,其中包含了扩展整数类型格式化输入输出的转换说明,以及关于这些类型的算术运算函数函数原型。但通常的说法是,“inttypes.h”是对“stdint.h”的补充,而且它总是“#include<stdint.h>”。
(1)数据类型
imaxdiv_t:从名字上可以看出这是那种同时求商和余数的算术运算函数。这个是“intmaxt”数据类型版本(参见14.4.6节)。
(2)函数原型
“inttypes.h”中描述的函数原型一共有6个,其功能如表14-10所示。
表14-10 “inttypes.h”中的函数原型
(3)宏
“inttypes.h”中定义的宏比较多,它们的宏体都是字符串字面值。在scanf()和printf()函数系列中输入输出扩展整数类型数据时,这些宏提供部分格式转换说明(Conversion Specification)。具体地说,是给出长度修饰符(Length Modifiers或Size Modifiers)和转换说明符(4)(Conversion Specifier或Conversion letter)。举例来说,就是给出相当于转换说明“%-14.41u”中“lu”那部分。
由于在“stdint.h”中出现的每一种扩展整数类型的格式转换说明都需要规定多种,所以这部分宏很多。
但是这类宏的标识符都很有规律。用于printf()函数系列的均以“PRI”开头;用于scanf()函数系列的均以“SCN”开头。
然后紧跟其后的是对“转换说明符”的描述(d, i, o, u, x, X)。
再然后是对扩展整数类型名称及位数的描述:KN。其中K可以为:空(表示“精确长度类型”)、LEAST(表示“最小长度类型”)、FAST(表示“最快长度类型”)、MAX(表示“最大长度类型”)、PTR(表示指针长度的整数类型)。
这样,如果需要以十进制方式输入一个64位的“int64_t”类型数据,就需要把转换说明写成“"%"SCNd64”。如果需要按照八进制输出这个“int64_t”类型数据并要求输出宽度至少为20位的话,需要把输出格式写为“"%20"PRId64”。下面是一个示意性的例子。
程序代码14-5
输出结果如图14-5所示。
图14-5 “inttypes.h”中定义的宏