/Zc:gotoScope
(goto スコープに準拠を強制する)
/Zc:gotoScope
コンパイラ オプションを使用すると、ローカル変数の初期化をジャンプするgoto
ステートメントに関する標準 C++ の動作をチェックできます。
構文
/Zc:gotoScope
[-
]
解説
/Zc:gotoScope
コンパイラ オプションは、1 つ以上のローカル変数の初期化をジャンプするgoto
ステートメントに対して C++ 標準動作を適用します。 コンパイラは、/Zc:gotoScope
が指定されている場合、このようなすべての場合にエラー C2362 を出力します。 /Zc:gotoScope-
はこのチェックを緩和しますが、goto
が単純でないデストラクターを持つローカル変数の初期化をスキップした場合でも、コンパイラはエラーを出力します。
/Zc:gotoScope-
オプションの目的は、より準拠したコードへの古いコード ベースの移行を容易にすることです。 準拠していないコードを更新するまで、特定のエラーを抑制するために使用できます。
/Zc:gotoScope
コンパイラ オプションは、Visual Studio 2022 バージョン 17.4 の新機能です。 既定では、 オプションはオフになっています。 /permissive-
オプション (または、/std:c++20
や/std:c++latest
など、/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] または [適用] を選択して、変更内容を保存します。