【问题标题】:Index specification in printf format specifierprintf 格式说明符中的索引说明
【发布时间】:2017-11-16 12:47:42
【问题描述】:

在以下程序中,printf() 函数根据参数索引规范打印。

#include <stdio.h>

int main()
{
        printf("%3$d  %4$f  %2$d  %1$d\n", 1,  2,  3,  4.5);
}

输出:

3  4.500000  2  1

所以,我有一个问题,它对任何编译器都有效还是仅支持 GCC 编译器?

【问题讨论】:

  • gcc 编译器不为独立环境提供除标头之外的标准库。那么,您使用哪种标准库实现?
  • “它对任何编译器都有效” 是的,正如您自己的编译所证明的那样 - 它至少对一个编译器有效。 “只支持 GCC 编译器?”是一个广泛的问题。要回答是,需要调查许多编译器以找到另一个支持它的编译器。要回答“否”,可能需要调查所有编译器。
  • 查看是否为GCC扩展,编译时包含-pedantic选项

标签: c indexing printf format-specifiers


【解决方案1】:

正如您所怀疑的,C standard 不需要编号参数转换规范(即n$)。但它们对 Gnu 实现并不特殊。它们是 POSIX standard(规范 here)所要求的,并且至少从 1997 年第 2 版开始。

大多数 Unix 和类 unix 实现都具有一定程度的 Posix 合规性,并且编号参数规范不是最近添加的。因此,您可能会在大多数当前的 Unix 和类 Unix 平台中找到支持,包括任何使用 Gnu 标准 C 库 (Linux) 或 FreeBSD 标准 C 库 (Mac OS X) 的平台。但是,如果您使用 *printf_p 系列函数,(本机)Windows C 标准库(不符合 Posix)仅提供对编号参数规范的支持。见herehere。)

【讨论】:

  • 对于 Windows,Microsoft 还引入了 printf_p 位置参数,以提供通过数字指定将哪些参数替换为格式字符串中的字段的能力。见printf_p Positional Parameters | Microsoft Docs
  • @YangJk:很高兴知道,谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2011-05-14
相关资源
最近更新 更多