什么编译器不支持printf标志中的“%#x”样式?

时间:2012-01-03 16:43:46

标签: c compiler-construction posix printf

我理解%#x给出了与0x%x相同的效果,它符合POSIX标准。但人们提到一些编译器不支持它。这是真的吗,任何一个例子?

4 个答案:

答案 0 :(得分:5)

除了一些破碎的嵌入式系统C库之外,#修饰符应该得到普遍支持。但%#x0x%x不一样。它们为值0产生不同的结果,#修饰符将始终在与十六进制数字相同的情况下打印x(例如%#x给出0xa和{{ 1}}使用%#X)使用0XA会允许您使用小写0x%X和大写十六进制数字(在视觉上更令人愉悦,至少对我而言)。因此,我发现x修饰符在实践中很少有用。

答案 1 :(得分:2)

%#x是C89,C99和C11中printf格式字符串中的有效转换规范。

答案 2 :(得分:2)

#标志字符不是来自POSIX,而是来自C标准(§7.21.6.1)。如果编译器或库不支持它,那么它不是C编译器/标准库。

答案 3 :(得分:1)

这完全有效,符合C规范 - 7.21.6.1 The fprintf function - 点#6

  

     

结果转换为“替代形式”。对于o转换,它会增加      精度,当且仅在必要时,强制结果的第一个数字为a      零(如果值和精度均为0,则打印单个0)。对于x(或X)      转换时,非零结果的前缀为0x(或0X)。对于a,A,e,E,f,F,g,      和G转换,总是转换浮点数的结果      包含小数点字符,即使后面没有数字。 (通常,a      只有数字时,小数点字符才会出现在这些转换的结果中      跟着它。)对于g和G转换,尾随的零没有被删除      结果。对于其他转换,行为未定义。