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

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

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

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

関連項目

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