2016-08-24 5 views
2

私は可逆文字列で倍精度浮動小数点数を表現するために必要な、と私はprintfが%aをサポートするかどうかを検出する方法は?

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

を使用しています。これは、私のシステムで正常に動作しますが、WindowsでMinGWの上に構築されたときに、警告を与える:

unknown conversion type character 'a' in format 

私はこのケースの回避策をコーディングしましたが、回避策を使用する必要があるときの検出に問題があります。#if __STDC_VERSION__ >= 199901Lを試しましたが、%aをサポートしていないとしてもGcc/MinGWで定義されています。確認できる別のマクロはありますか?

+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のサポートが完了していない、特にaのようなprintf(3)のオプションのいくつかが欠落しています。

+2

実際の質問に答えるには、回避策の使用を決めるには、おそらく '#ifdef __MINGW32__'で十分です。 – jxh

3

これは「printfが%aをサポートするかどうかを検出する方法」という質問には答えません。一般的には、%aがサポートされるようにコンパイラのインストールを変更することができます。

まず、mingw-w64を使用してください。これはMinGWの最新のフォークです。 MinGWの元のバージョンはよく管理されておらず、あなたが経験しているようなバグを修正しません(Microsoftや何かを非難することを好みます)。

は、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を使用します。 0xc.8f5c28f5c28f8p-2を出力

#define __USE_MINGW_ANSI_STDIO 1 
#include <stdio.h> 

int main() 
{ 
    long double x = 3.14; 
    printf("%La\n", x); 
} 

:あなたはmingwの-W64独自のprintfの実装を使用する必要があります。これは実際には0x1.91eb85p+1と同じ番号であり、精度とバイナリポイントの配置が異なりますが、これも正しいです。

関連する問題