(GCC)美元符号printf格式字符串

pol*_*.ph 16 c format printf gcc

我在用C编写的源代码中看到了以下行:

printf("%2$d %1$d", a, b);
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

pol*_*.ph 24

它是POSIX添加的语言扩展(符合C11的行为应该如@chux的回答中所述).符号%2$d表示与%d(输出有符号整数)相同,除非它使用给定的基于1的数字格式化参数(在您的情况下,它是第二个参数b).

因此,当您运行以下代码时:

#include <stdio.h>
int main() {
    int a = 3, b = 2;
    printf("%2$d %1$d", a, b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你会得到2 3标准输出.

更多信息可以在printf手册页上找到.

  • @karthikr,回答自己的问题[欢迎并鼓励](http://stackoverflow.com/help/self-answer).在这种情况下,我同意你的观点,它看起来像一个明显的搜索抓取,因为它只是重复文档中随时可用的信息. (10认同)
  • 当真?1秒后你回答你自己的问题? (7认同)
  • @CarlNorum作为Windows用户,我花了一个小时寻找那本手册,所以对我来说这似乎不像是抓住了. (5认同)
  • 这对我来说很有用,无论它是否被抢夺 (5认同)
  • 你不讲完整个故事.这个东西是C标准的非便携式扩展.您至少应该解释这个C库的实现. (4认同)
  • 它不是GCC扩展,它是POSIX(Unix)扩展.GCC只是一个编译器,依赖于系统libc来实现标准库.在标准库缺少此功能的系统上,例如MINGW-Windows,GCC也会丢失它. (3认同)

chu*_*ica 11

根据C规范C11dr 7.21.6.1

作为打印格式的一部分,首先%"%2$d %1$d"引入了一个指令.该指令可能有各种标志,宽度,精度,长度修饰符,最后还有转换说明符.在这种情况下2是宽度.下一个字符$既不是精度,长度修饰符也不是转换说明符.因此,由于转换规范无效,

......行为未定义. C11dr 7.21.6.1 9

C规范讨论了未来的图书馆方向.可以在将来添加小写字母,并且可以在扩展中使用其他字符.当然$不是小写字母,所以这对未来有好处.它当然适合"其他角色"角色,因为$它甚至不是C字符集的一部分.

在各种*nix实现中,$使用Linux程序员手册PRINTF(3)中的描述.的$,与前面的整数沿着限定了宽度的参数索引.