8

私はこの男と同じ問題を抱えています。clang と ccache を使用してコンパイルすると、Q_OBJECT に遭遇するたびに次の警告が表示されます。

warning: explicitly assigning value of variable of type 'int' to itself [-Wself-assign]

これは ccache を使用している場合にのみ発生し、clang だけで同じコードをコンパイルすると問題なく動作します。

推奨される解決策は環境変数を設定することであるマクロ展開にも同様の問題があるようです

CCACHE_CPP2=yes

残念ながら、これは私の問題を解決していないようです。または、私のやり方が間違っているのかもしれません。

私が試してみました:

  • コマンドラインからのビルド

    • CCACHE_CPP2=yes ninja

    • export CCACHE_CPP2=yes ninja

  • Qt Creator からのCCACHE_CPP2ビルド、「ビルド環境」への追加

このマクロ展開の問題を解決するために他にできることはありますか? 私は特に警告をグローバルに (それは悪いため) またはローカルに (コンパイラ固有のボイラープレートですべてのマクロをラップすることを意味するため) 無効にしたくありません。

4

3 に答える 3

3

これをテストするための clang がないことを許してください。マレクの答えを拡張すると、プラグマを別のマクロ展開内に配置する可能性があります。これは非常に見苦しい解決策ですが、この方法では、コード ベース全体にプラグマを生成する代わりに、マクロを 1 回定義するだけで済みます。

#define WARN int&x = x;

#define NO_WARN _Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wuninitialized\"") \
WARN \
_Pragma("GCC diagnostic pop")

int main(){
  NO_WARN
}

ご覧のとおり、gcc でテストしました (現在、clang でテストする手段はありません) が、マクロ内で "GCC" を "clang" に置き換える (および -Wself_assign を使用する) ことにより、clang で正常に動作するはずです。あなたの問題に適用する(疑似コード):

#ifdef clang
#define MY_Q_OBJECT _Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wself-assign\"") \
Q_OBJECT \
_Pragma("clang diagnostic pop")
#else
#define MY_Q_OBJECT Q_OBJECT
#endif
class A{
  MY_Q_OBJECT // Unfortunately you still need to replace Q_OBJECT on your classes
}

もう 1 つの見苦しい欠点は、少なくとも gcc では、プリプロセッサを機能させるために 2 回実行する必要があったことです。同じことがclangに必要かどうかはわかりません。

于 2015-02-04T19:26:15.063 に答える
3

-Wno-self-assign を CPP フラグに追加してみてください。自己割り当てエラーを無効にできるはずです:

CXXFLAGS= $(CXXFLAGS) -Wno-self-assign 

また

CPPFLAGS=$(CPPFLAGS) -Wno-self-assign
于 2015-01-27T12:16:12.773 に答える
1

この警告をグローバルに無視する IMO は問題ではありません。タイプミスによって引き起こされる潜在的な論理エラーについてではなく、ダミーコードについて警告します。そのため、@MichaelCMS の回答に投票しました。

ただし、コードの一部のセクションでのみ警告を無効にする方法があります。

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wself-assign"
Q_OBJECT
#pragma clang diagnostic pop

(フラグ名を台無しにしなければ) これでうまくいくはずですが、ボイラー プレート マクロが多くて好きではありません。

于 2015-02-03T09:10:32.147 に答える