Я пишу генератор C++, который должен использовать оператор goto
. Я компилирую свой код с помощью clang++ и получаю предупреждение [-Wmicrosoft-goto]
на некоторых из моих goto
. Все мои goto
прыгают только внутри одной функции, даже без объявления переменных стека, и я не вижу никакой разницы между моментом, когда я получаю предупреждение, и моментом, когда я не получаю предупреждения.
Мне бы очень хотелось использовать C++, соответствующий goto
, но я не могу найти никакой информации о том, что такое расширение Microsoft.
Не могли бы вы рассказать мне, что такое расширение Microsoft goto
и что вызывает это предупреждение в clang++?
Обновлено:
У меня была переменная стека, через которую перепрыгивали, вот в чем разница. Я решил это, поместив часть с переменной стека в {}
, и теперь предупреждение больше не появляется.
В свою защиту я надеялся, что кто-то просто знает, что такое расширение Microsoft goto
, или лучше знает, как найти документацию, в которой указано, что это такое.
Как вы думаете, почему вашему коду вообще нужен переход? Всегда можно написать код на C++ и без него.
Имейте в виду, что goto
обычно является признаком плохого кода. И исключения из этого правила довольно редки.
warning: jump from this goto statement to its label is a Microsoft extension
Кажется невозможным выяснить, что именно это означает на практике. Поисковые системы не находят ничего полезного, а документация MS так же ужасна, как и всегда. Не видя примера, практически невозможно определить, насколько ваш сгенерированный код отличается от стандарта.
Вы можете попробовать добавить фигурные скобки между переходом и меткой. goto skip; { std::string s{"hello"}; } skip: std::cout << "Skipped to here\n";
даже без объявлений переменных стека
Вы уверены? Единственный флаг соответствия для Visual C++, в котором упоминается goto
, — это /Zc:gotoScope, который помечает
goto
операторы, которые пропускают инициализацию одной или нескольких локальных переменных.
Это предупреждение находится в llvm clang.
@MarekR да, это предупреждение об использовании goto
, которое не соответствует требованиям, что (раньше) принималось Visual C++
Показ одного из ваших
goto
, генерирующих предупреждение, может помочь...