Поделиться через


/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

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.

  3. В дополнительных параметрах добавьте /Zc:gotoScope или /Zc:gotoScope-. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.

См. также

/Zc (Соответствие)
/permissive-
/std (определение стандартной версии языка)