【问题标题】:Is printf length modifier %L standard (or future standard)?printf 长度修饰符 %L 是标准(或未来标准)吗?
【发布时间】:2017-07-18 12:34:35
【问题描述】:

根据cppreference.com,长度修饰符 %L 仅对浮点类型有效。但是现代 GNU 编译器和库似乎也接受整数作为 %ll (long long) 的同义词。 cppreference 是否有可能在此错误?还是整数的 %L 将来会成为标准?

【问题讨论】:

  • %L 没有长度修饰符,L 是。 % 是转换规范语法的一部分。
  • But modern GNU compiler & library seems to accept it also for integers as synonym of %ll (long long)....来源好吗?
  • @SouravGhosh-- 来自glibc manual: "L, ll, q -- 指定参数是long long int...."

标签: c printf language-lawyer c99 c11


【解决方案1】:

来自最新的 C11 草案 N1570,§7.21.6.1 第 7 节:

L -- 指定以下 aAeEfFgG 转换说明符 适用于 long double 参数。

所以您的来源是正确的,L 作为 长度修饰符 仅用于 浮点 转换。我不希望这会在未来的版本中改变,因为根本没有必要。只需酌情使用lll

【讨论】:

  • 谢谢。使用 %L 对我来说非常诱人,它在视觉上很突出并且解析更简单。但让它成为 %ll。
【解决方案2】:

C11 标准的in §7.21.6.1 7 列出了有效的长度修饰符。

标准中唯一提到 L 作为长度修饰符的是 long double 类型:

L 指定后面的 a、A、e、E、f、F、g 或 G 转换说明符适用于 long double 参数。

此外,§7.31 Future Library Directions 中没有提及这一点:

7.31.11 输入/输出

  • 1 小写字母可以添加到转换说明符和 fprintf 和 fscanf 中的长度修饰符。可以使用其他字符 在扩展中。

  • 2 使用ungetc对二进制流的文件位置所在 指标在调用之前为零是过时的功能。

而且,L 的相同用法也适用于 the POSIX StandardL 是一个长度修饰符,只能用于 long double 类型。

【讨论】:

  • And, this is also not a length modifier mentioned in the POSIX Standard....我错过了什么吗?
  • 也谢谢你。 . .
  • @SouravGhosh-- 也许我遗漏了一些东西 ;) 我只是提供了一个细节,L 不仅在 ISO C 意义上不是这种用法的标准,而且在 ISO C 意义上甚至不是标准POSIX 意义......但我应该澄清我的措辞。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多