2012-01-03 96 views
3

我知道%#x給出了0x%x的相同效果,它符合POSIX標準。但是人們提到一些編譯器不支持它。這是真的嗎,任何例子?什麼編譯器不支持printf標誌中的「%#x」樣式?

+4

C編譯器都很好用。如果在某個地方沒有libc,我不會感到驚訝。 – Dave 2012-01-03 16:46:46

+1

爲了解釋@Dave的評論,編譯器只是C實現的一部分,而不是實現'printf'的部分。這是由C庫提供的,它可能甚至可能不是來自提供編譯器的同一個組織。 – 2012-01-03 19:22:21

回答

5

除了可能有些破碎的嵌入式系統C庫之外,#修飾符應該被普遍支持。然而%#x0x%x是不一樣的。他們產生不同的結果爲0值,而#修改將始終在同一案件中爲十六進制數字打印x(如%#x0xa%#X0XA),而使用0x%X將讓你有一個小寫x和資本十六進制數字(在視覺上更令人愉悅,至少對我而言)。因此,我發現#修飾符在實踐中很少有用。

2

%#x是在C89,C99和C11中的printf格式字符串中的有效轉換規範。

+1

這是最相關的答案。有許多當前編譯器不支持*的C99和/或C11標準所規定的功能。特別是微軟的C編譯器具有良好的C89/C90支持,但對C99的支持很差。但自從1989年的原始ANSI C標準以來,'%#x'已經達到了標準,所以所有現代C實現都應該支持它。 – 2012-01-03 19:21:32

2

#標誌字符不是來自POSIX,而是C標準(§7.21.6.1)。如果編譯器或庫不支持它,那麼它不是C編譯器/標準庫。

1

這是因爲每C規格完全有效 - 7.21.6.1 The fprintf function - 點#6

結果被轉換爲「‘替代形式’」。對於o轉換,當且僅當必要時,它強制增加 的精度,強制結果的第一個數字爲零(如果數值和精度均爲0,則打印單個0)。對於x(或X) 轉換,非零結果的前綴爲0x(或0X)。對於a,e,E,f,F,g, 和G轉換,轉換浮點數始終爲 的結果包含一個小數點字符,即使沒有數字跟隨它。 (通常,只有在 後面跟隨一個數字時, 小數點字符纔會出現在這些轉換的結果中。)對於g和G轉換,結果中不會刪除結尾的零。對於其他轉換,行爲未定義。