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(アンドロイドプラットフォーム)
私は 'LOG'は' std :: printf'の周りのラッパーマクロであると思いますか? – Rakete1111
はい、あなたは正しいです、それはラッパーです。 – Zoso