Posix是否为printf / scanf提供格式字符串宏?
printf
和scanf
系列函数使用了少数与基本数据类型相对应的原始格式说明符 – %d
表示int
, %llu
表示unsigned long long int
等。
但是,有很多标准化的类型别名需要在实践中使用,例如int32fast_t
,而且不能也不应该知道底层的基本类型。 对于stdint.h
的别名,C标准谢天谢地指定了一组宏来生成相应的格式字符串,如PRI32
,在inttypes.h
。
Posix有一组类似的宏吗? Posix有大量的不透明类型,如ssize_t
, pid_t
, rlim_t
, suseconds_t
等,它们都是基本整数类型的变体。 如何在格式字符串中可移植地使用这些类型?
sfio软件包(AT&T Labs的开源AST软件的一部分)具有类似于printf和scanf的function,可让您指定数值的大小(通常使用sizeof()
)作为附加参数。 一些例子:
sfprintf(sfstdout, "%I*d", sizeof(intval), intval); sfscanf(sfstdin, "%I*f", sizeof(fltval), &fltval);
USENIX论文: 使用Sfio扩展数据格式 。
Posix保证sys / types.h值是“适当长度的算术类型”,其他几个值进一步指定为无符号或带符号的“扩展长度”。 输出它们的唯一标准可接受的方法是通过最大适当语言类型(u)intmax_t中的强制转换它,然后输出它。
输入它们会更危险(即,不符合标准的方式),因为很难保证转换到基类型不会溢出某些东西。