2017-07-18 23 views
1

cppreference.com長度修飾符%L僅適用於浮點類型。但現代GNU編譯器似乎也接受它作爲%ll(long long)的同義詞的整數。有沒有可能在這方面引用錯誤?或者%L是整數在未來會成爲標準嗎?是printf長度修飾符%L標準(或未來標準)?

+2

'%L'沒有長度修飾符,'L'是。 '%'是轉換規範語法的一部分。 –

+0

'但現代的GNU編譯器和庫似乎也接受它作爲%ll(long long)的同義詞的整數。 –

+2

@ SouravGhosh - 從[glibc手冊](https://www.gnu.org/software/libc/manual/html_node/Integer-Conversions.html#Integer-Conversions):「'L','ll', 'q' - 指定參數是'long long int' ....「 –

回答

4

從最新的C11草案N1570,§7.21.6.1第7節:

L - 指定後續aAeEfFg,或G轉換符 適用於long double參數。

所以你的來源是正確的,L作爲長度修改只爲定義浮點轉換。我不希望這會在未來的版本中發生變化,因爲根本沒有必要。酌情使用lll

+1

謝謝。對我來說,使用%L非常誘人,它在視覺上突出並且解析更簡單。但讓它成爲%ll。 – ddbug

3

C11標準中列出了有效長度修飾符in §7.21.6.1 7

L如在標準的長度修飾符的唯一提到是long double類型:

大號 用於指定後續的一個,A,E,E,F,F,G或G轉換說明符適用於長雙重參數。

此外,存在在沒有§7.31 Future Library Directions此提及:

11年7月31日輸入/輸出< stdio.h>中

  • 1小寫字母可被添加到該轉化說明符和 fprintf和fscanf中的長度修飾符。其他字符可用於擴展中的 。

  • 2上的二進制流的使用,其中ungetc函數的文件位置 指示符是零之前該呼叫是過時的功能。

而且,同樣使用的L持有the POSIX StandardL是根據僅long double類型一起使用的長度改性劑。

+0

'而且,這也不是POSIX標準中提到的長度修飾符。「......我錯過了什麼嗎? –

+0

也謝謝。 。 。 – ddbug

+0

@ SouravGhosh--也許我錯過了一些東西;)我只是提供了詳細信息,'L'不僅在ISO C意義上的這種用法中不是標準的,而且在POSIX意義上甚至不是標準的......但是我應該澄清我的措詞。 –