共用方式為


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

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

語法

/Zc:gotoScope[-]

備註

編譯 /Zc:gotoScope 程式選項會強制執行 C++ Standard 行為,這些 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 (指定語言標準版本)