【问题标题】:Does Posix supply format string macros for printf/scanf?Posix 是否为 printf/scanf 提供格式字符串宏?
【发布时间】:2013-08-30 13:40:01
【问题描述】:

C 中的 printfscanf 函数族使用一些与基本数据类型相对应的原始格式说明符 - %d 用于 int%llu 用于 unsigned long long int 等。

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

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

【问题讨论】:

  • 如果一切都失败了,您可以随时转换为(u)intmax_t 并打印出来
  • 有趣的解决方法 - 我从来没有想过:-S
  • (虽然倒退,即scanf,但我必须进行手动溢出检查并找出要准确比较的内容。)
  • 我似乎记得有一些 typedef 不知道类型是整数还是浮点数(在时间处理区域中)。在这种情况下,转换为 long double ;-)
  • @AProgrammer:是的,time_t 不保证是整数或浮点数。这甚至在 C 标准库中,我认为也没有相应的宏。

标签: c++ c posix printf


【解决方案1】:

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

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

USENIX 论文:Extended Data Formatting Using Sfio.

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      相关资源
      最近更新 更多