printf长度修饰符%L标准(或未来标准)?

时间:2017-07-18 12:34:36

标签: c printf language-lawyer c99 c11

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

2 个答案:

答案 0 :(得分:4)

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

  

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

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

答案 1 :(得分:3)

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

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

  

→       指定跟随a,A,e,E,f,F,g或G转换说明符适用于long double参数。

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

  

7.31.11输入/输出< stdio.h>

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

  •   
  • 2在文件位置的二进制流上使用ungetc   在通话之前,指标为零是一个过时的功能。

  •   

并且,the POSIX Standard LL的使用方式相同:long double是一个长度修饰符,仅用于function rotate($array, $new_array = array()) { $sub_array = array_shift($array); $sub_array['b'] = explode(',', $sub_array['b']); $sub_array['c'] = explode(',', $sub_array['c']); while($b = array_shift($sub_array['b'])) { foreach($sub_array['c'] as $c) { $new_array[] = array('a' => $sub_array['a'], 'b' => $b, 'c' => $c); } } return $array ? rotate($array, $new_array) : $new_array; } $new_array = rotate($array); 类型。