2012-01-03 63 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转换,结果中不会删除结尾的零。对于其他转换,行为未定义。