如何检测printf是否支持%a?
我需要无损代表一个双精度浮点数的字符串,所以我用如何检测printf是否支持%a?
sprintf(buf, "%la", x);
这工作得很好我的系统上,但在Windows下的MinGW的建成,给了一个警告:
unknown conversion type character 'a' in format
我为这种情况编码了一种解决方法,但在检测何时应该使用解决方法时遇到了问题 - 我试过#if __STDC_VERSION__ >= 199901L
,但似乎Gcc/MinGW定义了即使它不支持%a
。有我能检查的另一个宏吗?
由于jxh已经怀疑,MingW使用Windows的MSVCRT LibC。 C99的支持并不完整,特别是printf(3)
的一些选项a
缺失。
要回答实际问题, '#ifdef __MINGW32__'可能足以决定使用解决方法。 – jxh
这并不回答“如何检测printf是否支持%a?”这个问题。在一般情况下,但您可以修改您的编译器安装,以便支持%a
。
首先,使用mingw-w64。这是MinGW的最新分支。 MinGW的原始版本没有得到很好的维护,并没有修复你遇到的错误(更喜欢责怪微软等)。
在Windows 10使用的MinGW-W64 4.9.2,下面的代码工作对我来说:
#include <stdio.h>
int main()
{
double x = 3.14;
printf("%a\n", x);
}
生产0x1.91eb85p+1
这是正确的。这仍然推迟到Microsoft运行时。
你的问题中提到%la
,但是%a
和%la
都是相同的,可用于打印无论是float
或double
说法。
如果您想打印long double
,那么Microsoft运行时不支持该操作; gcc和MS使用不同尺寸的long double
。你必须使用的MinGW-W64自己的printf实现:
#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>
int main()
{
long double x = 3.14;
printf("%La\n", x);
}
其输出0xc.8f5c28f5c28f8p-2
。这实际上是与0x1.91eb85p+1
相同的数字,具有更高的精度和不同的二进制点位置,这也是正确的。
看看标准怎么样? http://port70.net/~nsz/c/c11/n1570.html#7.21.6.1?如果您的环境不支持此操作,则不符合规定。 – Olaf
版本信息的'-v'报告是什么? – jxh
我没有可轻松访问的编译器环境 - 我从包构建服务获取日志。 – crowding