我知道%#x給出了0x%x的相同效果,它符合POSIX標準。但是人們提到一些編譯器不支持它。這是真的嗎,任何例子?什麼編譯器不支持printf標誌中的「%#x」樣式?
回答
除了可能有些破碎的嵌入式系統C庫之外,#
修飾符應該被普遍支持。然而%#x
和0x%x
是不一樣的。他們產生不同的結果爲0值,而#
修改將始終在同一案件中爲十六進制數字打印x
(如%#x
給0xa
和%#X
給0XA
),而使用0x%X
將讓你有一個小寫x
和資本十六進制數字(在視覺上更令人愉悅,至少對我而言)。因此,我發現#
修飾符在實踐中很少有用。
%#x
是在C89,C99和C11中的printf
格式字符串中的有效轉換規範。
這是最相關的答案。有許多當前編譯器不支持*的C99和/或C11標準所規定的功能。特別是微軟的C編譯器具有良好的C89/C90支持,但對C99的支持很差。但自從1989年的原始ANSI C標準以來,'%#x'已經達到了標準,所以所有現代C實現都應該支持它。 – 2012-01-03 19:21:32
#
標誌字符不是來自POSIX,而是C標準(§7.21.6.1)。如果編譯器或庫不支持它,那麼它不是C編譯器/標準庫。
這是因爲每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轉換,結果中不會刪除結尾的零。對於其他轉換,行爲未定義。
- 1. 用於編譯器的printf宏,支持和不支持VARIADIC
- 2. 什麼編譯器支持CUDA
- 3. 爲什麼OpenCV不支持ffmpeg編譯?
- 4. 什麼是「DNS_BLOCK_ASSERTIONS」(C編譯器標誌)?
- 5. 所有的gcc編譯器都支持@FILE標誌嗎?
- 6. 什麼樣的標誌適用於什麼樣的編譯階段?
- 7. 什麼的JIT編譯器不支持CLR
- 8. 爲什麼printf不能編譯?
- 9. Angular 2的前期編譯器是否支持SASS樣式表?
- 10. g ++等效的編譯器標誌到VC++編譯器標誌
- 11. 爲什麼編譯器不支持C++ 11 thread_local存儲?
- 12. 爲什麼Java編譯器不支持繼承導入?
- 13. 編譯的Vim支持Python在OS X
- 14. 什麼是Xcode5中的「其他故事板編譯器標誌」
- 15. 什麼是Java 9編譯器中的--release標誌?
- 16. 爲什麼不設置Swift編譯器標誌?
- 17. - 預編譯標誌應該做什麼?
- 18. -fPIC編譯標誌有什麼作用?
- 19. ios編譯ffmpeg不支持ac3支持
- 20. 編譯器支持C11
- 21. Erlang編譯器UTF32支持
- 22. 'optimize'scala編譯器標誌是做什麼的?
- 23. 什麼是-qnoweakexp xlC編譯器標誌的gcc等價物?
- 24. 屬性(noinline)支持需要什麼ARM編譯器版本?
- 25. 什麼是Fortran編譯器支持這些功能?
- 26. Objective-C編譯器標誌
- 27. 編譯器標誌在Eclipse
- 28. C++編譯器標誌11
- 29. GCC編譯器標誌「-DEVAL」
- 30. Cython OpenMP編譯器標誌
C編譯器都很好用。如果在某個地方沒有libc,我不會感到驚訝。 – Dave 2012-01-03 16:46:46
爲了解釋@Dave的評論,編譯器只是C實現的一部分,而不是實現'printf'的部分。這是由C庫提供的,它可能甚至可能不是來自提供編譯器的同一個組織。 – 2012-01-03 19:22:21