2016-08-24 122 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相同的數字,具有更高的精度和不同的二進制點位置,這也是正確的。