0

私は Windows ストア アプリに取り組んでおり、Visual Studio の警告レベルを 4 に上げたばかりなので、参照されていないパラメーターの警告を修正しています。その過程で、参照されていないフレームワーク管理パラメーター (^) は、他の参照されていない「正式な」パラメーターのように C4100 警告を生成しないことに気付きました。私が何を意味するかを説明するには:

void Method(CNonFrameworkManaged* pObject)
{
    // Warning C4100: 'pObject' : unreferenced formal parameter
}

void Method(CFrameworkManaged^ spObject)
{
    // No warning
}

2番目が警告を生成しないのはなぜですか? そして、そのような警告をオンにする方法はありますか? コードに一貫性を持たせたいのですが、これらすべてを手作業で追跡するには数日かかります..

注: CLR サポートなしでプロジェクトをコンパイルしていますが、これらはまだ検出可能であるようです。

4

1 に答える 1

4

ハット型はスマート ポインターの形式であるため、各ハット型には、ポイント先のオブジェクトの所有権を解放するデストラクタがあります。spObjectソース コードでは名前で参照されませんが、オブジェクトは関数の最後でコンパイラが生成したデストラクタへの呼び出しによって参照されます。

コンパイラが参照されていないローカル変数をチェックすると、この参照が検出され、警告は発行されません。通常の (パラメータではない) ローカル変数には名前が必要であり、破棄するためだけに存在するローカル変数 (たとえば、 のような RAII 型) に対してコンパイラが「参照されていないローカル変数」という警告を発行すると、問題が発生しますlock_guard。警告 C4101 および C4189 は、参照されていないパラメーター以外のローカル変数に対して発行されます。(コンパイラーはパラメーターを別の方法で処理できますか? おそらくですが、そうではありません。)

デストラクターを持つ型のパラメーターに対して C4100 が発行されていないことを確認します。

struct A { };
struct B { ~B() { } };

void f(A a) { } // C4100 is issued for 'a'
void f(B b) { } // C4100 is not issued for 'b'
于 2013-04-19T00:56:06.060 に答える