1

Microsoft 固有のステートメントに関する MSDN ドキュメントには__if_exists次のように記載されています (強調を追加)。

クラス内外の識別子に __if_exists ステートメントを適用します。__if_exists ステートメントをローカル変数に適用しないでください

残念ながら、これをローカル変数に適用してはいけない理由についての説明はありません。それはうまくコンパイルされ、期待される効果があります。それは正確性の問題ですか、それとも保守性の問題ですか、それとも他の何かですか?

これは Microsoft 固有の機能であり、移植性がないことは理解していますが、議論のために、これを使用する正当な理由があると仮定しましょう。

編集: なぜ私がこれを行っているのか知りたがっている人もいるので、ここに説明があります。私はこれが汚いハックであることを理解しています. これは、コード ベースのサイズが大きいことを考えると、私たちが見つけることができた中で最もコストがかからない代替手段です。

__FUNCTION__エラー ログ パッケージの一部としてMicrosoft 固有のマクロを使用する大量のレガシ コード (数百万行) があります。そのコードのかなりの部分がラムダ関数内にラップされるようになったため、構造化された例外 ( __try/__exceptを使用) をキャッチし、巻き戻し可能なオブジェクトを引き続き使用できます。これらのラムダ関数の中で、は何の役にも立た__FUNCTION__ない のような役に立たないものに評価され`anonymous-namespace'::<lambda23>::operator()ます。これに対する私たちの回避策は__FUNCTION____if_exists. マクロの仕組みにより、新しいマクロに簡単に切り替えることができます__FUNCTION__大量のコードを変更することなく代替名変数を置き換えて簡単に定義できるため、制限を考えると合理的にクリーンなソリューションです。__if_existsもちろん、この方法を使用することが有効であることが前提です。

上で言ったように、私はそれが汚いハックであることを知っています。

4

2 に答える 2

3

確かなことはわかりませんが、1 つの推測では、ローカル変数がコンパイラによって最適化されて削除される可能性があり、もちろんそうではない可能性があり、__if_exists テストが信頼できなくなります。

また、ローカル変数に対してこれを行う理由もわかりません。あなたはその特定のスコープにいて、すべてを知っています。なぜローカル変数が存在するかどうかをテストしたいのですか?

于 2012-08-17T16:58:14.323 に答える