2017-06-20 1 views
0

2つの共有ライブラリにバンドルされるファイルがあります。コンパイラーは、32ビット・タイプ用と64ビット・タイプ用の2つのバージョンのライブラリーを作成します。2つの異なるバリアントで処理されるライブラリのWformat

size_t len; 

とprint文の書式指定子は、次のとおりです。:今、私は、変数を含む診断ログを印刷する必要が

LOG("The length is %ld",len); 

コンパイラは文句64ビット版の作成:

format specifies type 'unsigned int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] 

私は%LDからの%のLUに変更した場合、32ビット版は文句:

format specifies type 'unsigned long' but the argument has type 'size_t' (aka 'unsigned int') [-Wformat] 

-Wformatエラーを回避するには(もちろん、これを抑制することは、私が探している解決策ではありません)?コンパイラのバージョンをチェックし、それに応じて診断を書くために#ifdefsに頼らなければなりませんか?

コンパイラのバージョン:クラン3.8(アンドロイドプラットフォーム)

編集:誰かが関連する質問にそれを複製し。 size_tのが一般的であるように思われるので、私は別の例でそれを提起してみましょう:

jlong val; 
LOG("val = %ld",val): 

32ビットコンパイラのパスを実行している場合:

warning: format specifies type 'long' but the argument has type 'jlong' (aka 'long long') [-Wformat] 

だから私は警告を抑制するために%のLLDにそれを変更しようとするならば、私が取得: 64ビットのパスを実行している場合:

warning: format specifies type 'long long' but the argument has type 'jlong' (aka 'long') [-Wformat] 

このような場合に対処する方法は?そして再び繰り返し強調:

コンパイラのバージョン:クラン3.8(アンドロイドプラットフォーム)

+0

私は 'LOG'は' std :: printf'の周りのラッパーマクロであると思いますか? – Rakete1111

+0

はい、あなたは正しいです、それはラッパーです。 – Zoso

答えて

0

あなたがC++ 17をサポートしてコンパイラを使用している場合、あなたはこのような何かを行うことができます。

enum class Environment { bit32, bit64 }; 

#ifdef __x86_32__ 
constexpr Environment environment = Environment::bit32; 
#elif __x86_64__ 
constexpr Environment environment = Environment::bit64; 
#endif 

void print_statement() 
{  
    if constexpr (environment == Environment ::bit32) { 
    // do your 32 bit thing. 
    } 
    else if constexpr (environment == Environment ::bit64) { 
    // do your 64 bit thing. 
    } 
} 
関連する問題