У меня есть программа с оператором switch
, подобным этому:
switch(n)
{
case 0:
/* stuff */
break;
int foo;
case 1:
foo = 5;
break;
case 2:
foo = 6;
break;
}
Обратите внимание на int foo;
между case 0
и case 1
. Это утверждение недостижимо: если вы пройдете через программу, вы никогда не перейдете через нее.
Он компилируется без предупреждений или ошибок с Clang, но, похоже, он был сбит с толку, когда я его запускал (хотя это могло быть связано с другими причинами).
Это четко определенное поведение - объявлять переменную в недостижимом операторе и использовать его в достижимых операторах, и будет ли это работать?
1 ответ
Это четко определенное поведение, если переменная имеет тривиальную конструкцию и имеет (приблизительно) такой же эффект, как если бы переменная была объявлена в более широкой области.
Если потребуется инициализация, вы получите сообщение об ошибке.
В разделе 6.7 говорится
Можно передать в блок, но не в обход объявлений с инициализацией. Программа, которая перескакивает из точки, где переменная с автоматической продолжительностью хранения не находится в области видимости, к точке, где она находится в области видимости, плохо сформирована, если только переменная не имеет скалярный тип, тип класса с тривиальным конструктором по умолчанию и тривиальный деструктор, a cv-квалифицированная версия одного из этих типов или массив одного из предыдущих типов и объявляется без инициализатора.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .