У меня есть программа с оператором 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, но, похоже, он был сбит с толку, когда я его запускал (хотя это могло быть связано с другими причинами).

Это четко определенное поведение - объявлять переменную в недостижимом операторе и использовать его в достижимых операторах, и будет ли это работать?

2
zneak 6 Апр 2013 в 22:37
2
Это не очень хорошая практика, что бы ни говорилось в спецификации, и, вероятно, ее все равно нужно исправить.
 – 
Robert Harvey
6 Апр 2013 в 22:38

1 ответ

Лучший ответ

Это четко определенное поведение, если переменная имеет тривиальную конструкцию и имеет (приблизительно) такой же эффект, как если бы переменная была объявлена ​​в более широкой области.

Если потребуется инициализация, вы получите сообщение об ошибке.

В разделе 6.7 говорится

Можно передать в блок, но не в обход объявлений с инициализацией. Программа, которая перескакивает из точки, где переменная с автоматической продолжительностью хранения не находится в области видимости, к точке, где она находится в области видимости, плохо сформирована, если только переменная не имеет скалярный тип, тип класса с тривиальным конструктором по умолчанию и тривиальный деструктор, a cv-квалифицированная версия одного из этих типов или массив одного из предыдущих типов и объявляется без инициализатора.

5
Ben Voigt 6 Апр 2013 в 22:50
Боже, ненавижу читать спецификации языков программирования. Я тоже не понимаю, насколько уместен этот абзац.
 – 
Robert Harvey
6 Апр 2013 в 23:03
2
@ Роберт Харви: Почему бы и нет? Этот абзац определяет, когда разрешено «пропустить» объявление переменной и перейти непосредственно к точке, где переменная используется, а когда нет.
 – 
Andy Prowl
6 Апр 2013 в 23:08
@RobertHarvey, он говорит, что программа, которая перескакивает из места до объявления переменной в какое-то место после того, как она правильно сформирована, пока переменная не нуждается в инициализации.
 – 
zneak
6 Апр 2013 в 23:12