/Zc:gotoScope
(Принудительное соответствие в области goto)
Параметр /Zc:gotoScope
компилятора позволяет проверять поведение C++ уровня "Стандартный" вокруг goto
инструкций, которые переходют к инициализации локальных переменных.
Синтаксис
/Zc:gotoScope
[-
]
Замечания
Параметр /Zc:gotoScope
компилятора применяет стандартное поведение C++ вокруг goto
инструкций, которые переходют к инициализации одной или нескольких локальных переменных. Компилятор выдает ошибку C2362 во всех таких случаях при /Zc:gotoScope
указании. Этот /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
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.
В дополнительных параметрах добавьте
/Zc:gotoScope
или/Zc:gotoScope-
. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.
См. также
/Zc
(Соответствие)
/permissive-
/std
(определение стандартной версии языка)