/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 中設定這個編譯器選項
開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。
在 [其他選項] 中,新增
/Zc:gotoScope
或/Zc:gotoScope-
。 選擇 [確定] 或 [套用] 以儲存變更。