/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 で使用するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  3. [追加のオプション] で、/Zc:gotoScope または /Zc:gotoScope- を追加します。 [OK] または [適用] を選択して、変更内容を保存します。

関連項目

/Zc (準拠)
/permissive-
/std (言語の標準バージョンの指定)