4

デストラクタに入れて、通常の終了と例外スタックの巻き戻しの両方で実行されるようにするコードがあります。

struct withProtectedClose {

  ~withProtectedClose() {
    // Do some cleanup here...
  }
};

void test() {
  withProtectedClose close;

  // Do some work before closing
}

それでも、g ++コンパイラ(g ++(GCC)3.4.6 20060404(Red Hat 3.4.6-11))は次のように不平を言っています。

test.cpp: In function `void test()':
test.cpp:28: warning: unused variable 'close'

どういうわけか変数を参照することでそれを沈黙させることができますが、それはコンパイラを沈黙させるためだけにコードを混乱させ、コードにどのように影響を与えたいかではありません。

デストラクタがあるという事実は、構築後に変数が使用されないという違いがないという点で、コンパイラを手がかりにするのに十分ではないでしょうか?

正当な未使用の変数の通知を受け取りながらコンパイラをシャットダウンできないと仮定すると、これを使用する以外に、これを無音にする方法はありますか?

4

3 に答える 3

2

私はそれがコンパイラのバグだと思う傾向があります。g++ 4.7.1 にはまだ存在します。

回避策として、何もしないコンストラクタを定義してみてください。g++ 4.7.1 では警告が抑制されますが、3.4.6 ではわかりません。

于 2012-09-11T14:32:11.587 に答える
1

これはGCCの問題にすぎないように思われるため、次のように構造体を宣言することで「修正」できます。

struct __attribute__ ((__unused__)) withProtectedClose

これにより、バージョン4.6.3コンパイラの警告が確実に消音されます(標準に従って、デストラクタが明らかに実行されます)。ただし、それ以外の場合は使用の変数について警告します。

ほとんどの場合、それはあなたが本当に知りたい間違いなので、警告(-Wno-unused-variable)を一緒にオフにすることは良い選択肢ではありません。他の理由がない場合は、コードを読む人を混乱させ、オプティマイザーに不必要な負担をかけるため、未使用の変数を(意図せずに)削除する必要があります。

移植性が必要な場合は、マクロを使用して属性をカプセル化します(非GCCでは空のマクロ)。

「コンパイラは、コンストラクタまたはデストラクタが実行される結果となる未使用の変数を無視する必要がありますか?」という実際の質問に対処するため。-いいえ。

C ++標準の状態[3.7.3.3]:

自動保存期間の変数に初期化または副作用のあるデストラクタがある場合、12.8で指定されているようにクラスオブジェクトまたはそのコピー/移動を削除できる場合を除いて、未使用のように見えても削除しないでください。

これまでのところ、コンパイラは変数を無視することはできません。ただし、意図しないことが多いことについて警告することは許可されています。

于 2012-09-11T15:37:53.430 に答える
0

このような場合、MSVC はこの警告を発行しません。gcc のバージョンがそうである場合は、次の方法で抑制してみてください。

withProtectedClose close; 
(close); 
于 2012-09-11T14:34:35.490 に答える