/Zc:gotoScope
(goto スコープに準拠を強制する)
/Zc:gotoScope
コンパイラ オプションを使用すると、ローカル変数の初期化をジャンプするステートメントに関goto
する標準 C++ 動作のチェックが可能になります。
構文
/Zc:gotoScope
[-
]
解説
コンパイラ オプションは /Zc:gotoScope
、1 つ以上のローカル変数の初期化をジャンプするステートメントに対 goto
して C++ 標準動作を適用します。 コンパイラは、このようなすべてのケースでエラー C2362 が指定されたときに /Zc:gotoScope
出力します。 このチェックは/Zc:gotoScope-
緩和されますが、単純でないデストラクターを持つローカル変数の初期化をgoto
スキップした場合でも、コンパイラはエラーを生成します。
このオプションの /Zc:gotoScope-
目的は、より準拠したコードへの古いコード ベースの移行を容易にすることです。 準拠していないコードを更新するまで、特定のエラーを抑制するために使用できます。
/Zc:gotoScope
コンパイラ オプションは、Visual Studio 2022 バージョン 17.4 の新機能です。 既定では、 オプションはオフになっています。 オプション (または、またはなど/std:c++20
/std:c++latest
、 を意味/permissive-
するオプション) によって/permissive-
自動的に有効になります。 エラーチェックを明示的に有効にするには、コンパイラのコマンド ラインに追加/Zc:gotoScope
します。 チェックを明示的に無効にするには、このオプションを/Zc:gotoScope-
使用します。 オプション/Zc:gotoScope-
または意味/permissive-
する任意のオプションの/permissive-
後に表示する必要があります。
例
このサンプルでは、次を使用して /Zc:gotoScope
コンパイルするとエラー メッセージが生成されます。
int g(int*);
bool failed(int);
int f() {
int v1;
auto result = g(&v1);
if (failed(result))
goto OnError;
int v2 = v1 + 2;
return v2;
OnError:
return -1;
}
/* Output:
t.cpp(9): error C2362: initialization of 'v2' is skipped by 'goto OnError'
*/
コードがコンパイルされている /Zc:gotoScope-
場合、コンパイラはエラーを出力しません。
指定した場合 /Zc:gotoScope-
でも、ローカル変数に単純でないデストラクターがある場合でも、コンパイラはエラーを出力します。 次に例を示します。
int g(int*);
bool failed(int);
class S {
public:
S(int);
~S();
int mf() const;
};
int f()
{
int v1;
auto result = g(&v1);
if (failed(result))
goto OnError;
S s(v1);
return s.mf();
OnError:
return -1;
}
/* Output:
t.cpp(17): error C2362: initialization of 's' is skipped by 'goto OnError'
*/
このコンパイラ オプションを Visual Studio で使用するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。
[その他のオプション] で、追加
/Zc:gotoScope
または/Zc:gotoScope-
. [OK] または [適用] を選択して、変更内容を保存します。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示