2016-08-24 120 views
2

我需要无损代表一个双精度浮点数的字符串,所以我用如何检测printf是否支持%a?

sprintf(buf, "%la", x); 

这工作得很好我的系统上,但在Windows下的MinGW的建成,给了一个警告:

unknown conversion type character 'a' in format 

我为这种情况编码了一种解决方法,但在检测何时应该使用解决方法时遇到了问题 - 我试过#if __STDC_VERSION__ >= 199901L,但似乎Gcc/MinGW定义了即使它不支持%a。有我能检查的另一个宏吗?

+3

看看标准怎么样? http://port70.net/~nsz/c/c11/n1570.html#7.21.6.1?如果您的环境不支持此操作,则不符合规定。 – Olaf

+1

版本信息的'-v'报告是什么? – jxh

+0

我没有可轻松访问的编译器环境 - 我从包构建服务获取日志。 – crowding

回答

2

由于jxh已经怀疑,MingW使用Windows的MSVCRT LibC。 C99的支持并不完整,特别是printf(3)的一些选项a缺失。

+2

要回答实际问题, '#ifdef __MINGW32__'可能足以决定使用解决方法。 – jxh

3

这并不回答“如何检测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都是相同的,可用于打印无论是floatdouble说法。

如果您想打印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相同的数字,具有更高的精度和不同的二进制点位置,这也是正确的。