共用方式為


/Zc:gotoScope (在 goto 範圍中強制執行一致性)

編譯 /Zc:gotoScope 程式選項會針對跨越局部變數初始化的語句,啟用標準C++行為 goto 檢查。

語法

/Zc:gotoScope[-]

備註

編譯程式 /Zc:gotoScope 選項會強制C++標準行為,這些 goto 語句會跳過一或多個局部變數的初始化。 當指定時/Zc:gotoScope,編譯程式會在所有這類情況下發出錯誤 C2362。 會 /Zc:gotoScope- 放寬這項檢查,但是如果 goto 略過具有非簡單解構函式之局部變數的初始化,編譯程式仍會發出錯誤。

選項的 /Zc:gotoScope- 意圖是協助簡化舊版程式代碼基底移轉至更符合規範的程序代碼。 您可以使用它來隱藏某些錯誤,直到您更新不符合規範的程式代碼為止。

編譯 /Zc:gotoScope 程式選項是Visual Studio 2022 17.4版的新功能。 選項預設為關閉。 這個選項會自動 /permissive- 開啟 ,或表示 /permissive-的選項,例如 /std:c++20/std:c++latest。 若要明確啟用錯誤檢查,請將 新增 /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-。 選擇 [確定] 或 [套用] 以儲存變更。

另請參閱

/Zc (一致性)
/permissive-
/std (指定語言標準版本)