2016-05-31 5 views
4

現在のビルド環境でタイプunsigned long longが使用可能な場合は、プリプロセッサディレクティブでどのようにチェックできますか?符号なしlong longが使用可能かどうかをチェック

私は

#if __STDC_VERSION__ >= 199901L 
    /* Available */ 
#else 
    /* Not available */ 
#endif 

をチェックするが、gccで少なくともこれは「avaibalbleない」ために(しかし働くだろう)つながる-std= -compiler引数なしでコンパイルしてみました。

少なくとも、C99標準コンパイラとGCCのどちらでも動作するように、より良いマクロがありますか?-std=C99

+8

最も洗練された解決策ではありませんが、私の最初の本能は、 'limits.h'ヘッダーに' ULLONG_MAX'シンボルの存在を確認することです。 –

+0

完了。私はあなたがもっと良い答えを得られなかったことに驚いています。クイック・アンド・ダーティーな解決策が時々最高ですね! –

答えて

1

解決策は最もエレガントではありませんが、私の最初の本能はlimits.hヘッダーにULLONG_MAXシンボルの存在を確認することです。

定義されている場合、unsigned long long intタイプがほぼ確実に利用可能です。定義されていない場合は、おそらく型が使用できないか、少なくとも十分にサポートされておらず、移植不可能なコンパイラ拡張としてしか使用できない可能性があります。

3

利用できない場合はどうしますか?あなたのコードはコンパイルされ、動作するはずですか?そうでない場合は、チェックを破棄し、unsigned long longを使用します。コンパイラはそれを処理できないかどうかを指示します。

そして、C99コンパイラで動作するマクロを作成したいのであれば、それは意味がありません。なぜなら、C99はunsigned long longを必要とするからです。

+0

彼はあなたの2番目の質問に答えます:* "gccでコンパイルし、少なくとも-std = -compiler引数を指定しないと、これは"準備できません "になりますが(しかし動作します)" * –

+0

1)次にエミュレートする必要がありますいくつかのより小さい 'int'を持つ64ビット整数算術演算子です。コードは中間値のために64ビットしか必要としません。 2)「long long」が利用可能かどうかチェックしたい。コードはすべてのコンパイラでコンパイルされ、少なくとも* long longが利用可能であると言及された状況を検出します。いくつかの奇妙なコンパイラで利用可能な '' long long''を検出する必要はありません。 – urzeit

関連する問題