9

C 中的printfscanf函数族使用少数原始格式说明符,这些说明符对应于基本数据类型 - %dfor int%lluforunsigned long long int等。

然而,有大量标准化的类型别名是人们想在实践中使用的,例如int32fast_t,而且人们不能也不应该知道底层的基本类型。对于 中的别名stdint.h,幸运的是,C 标准指定了一组宏来生成相应的格式字符串,PRI32例如inttypes.h.

Posix 是否有一组类似的宏?Posix 有大量的不透明类型,例如ssize_t, pid_t, rlim_t,suseconds_t等,它们都是基本整数类型的变体。如何在格式字符串中可移植地使用这些类型?

4

2 回答 2

1

sfio 包(AT&T Labs 的开源 AST 软件的一部分)具有类似于 printf 和 scanf 的功能,可让您指定数值的大小(通常使用sizeof())作为附加参数。一些例子:

sfprintf(sfstdout, "%I*d", sizeof(intval), intval);
sfscanf(sfstdin, "%I*f", sizeof(fltval), &fltval);

USENIX 论文:使用 Sfio 进行扩展数据格式化

于 2013-10-23T22:00:48.797 回答
0

Posix 保证 sys/types.h 值是“适当长度的算术类型”,而其他一些值被进一步指定为无符号或有符号“扩展长度”。输出这些的唯一标准可接受的方法是通过转换以最大的适当语言类型 (u)intmax_t 传输它,然后输出它。

输入它们会更危险(即,不可能以符合标准的方式),因为很难保证您转换到基本类型时不会溢出某些东西。

于 2013-08-31T23:41:59.043 回答