Posix是否为printf / scanf提供格式字符串宏?

printfscanf系列函数使用了少数与基本数据类型相对应的原始格式说明符 – %d表示int%llu表示unsigned long long int等。

但是,有很多标准化的类型别名需要在实践中使用,例如int32fast_t ,而且不能也不应该知道底层的基本类型。 对于stdint.h的别名,C标准谢天谢地指定了一组宏来生成相应的格式字符串,如PRI32 ,在inttypes.h

Posix有一组类似的宏吗? Posix有大量的不透明类型,如ssize_tpid_trlim_tsuseconds_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中的强制转换它,然后输出它。

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