我知道%#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