Ошибка компиляции с: переключатель, ожидаемое выражение перед

Переход к делу. Я воссоздал свою проблему, поскольку она не требует пояснений.

выполняется без ошибок:

switch (n) {
    case 1:
        NSLog(@"");
        NSString *aStr;
        break;
    default:
        break;
    }

это компилируется с ошибкой, и в нем отсутствует только NSLog ():

switch (n) {
    case 1:
        NSString *aStr;
        break;
    default:
        break;
    }

при компиляции выдается ошибка "Ожидаемое выражение перед 'NSString'"

Я что-то упустил?


person Ross    schedule 10.01.2010    source источник
comment
См. ‹stackoverflow.com/ questions / 1180550 / weird-switch-error-in-obj-c /  -  person johne    schedule 12.01.2010
comment
Я помню оператор switch / case с аналогичной ошибкой, он исчезал, когда я добавлял комментарий где-нибудь в блоке case .. Magic   -  person Yunus Nedim Mehel    schedule 06.12.2012


Ответы (2)


В обычном C вам нужно заключить это в скобки в обоих случаях. Я подозреваю, что это может решить вашу проблему:

case 1:
{
    NSLog(@"");
    NSString *aStr;
    break;
}

Дополнительную информацию см. В этом вопросе SO.

Другой способ обойти эту проблему - поместить оператор между меткой case и первым объявлением, как вы это сделали в своем рабочем примере выше. См. Комментарии и ответ Куинн Тейлор для получения дополнительной информации.

person Dan Olson    schedule 10.01.2010
comment
Интересный. Кронштейн не пробовал. - person Eimantas; 10.01.2010
comment
Да, это решает проблему. Я просто работал с заполнением кода xcode, который их не использует. Спасибо. - person Ross; 10.01.2010
comment
Я сталкивался с этой проблемой раньше, я сам решил ее с помощью {}, приятно видеть, что это правильное решение. +1 для тебя Дэн. - person David Wong; 10.01.2010
comment
Вам не обязательно использовать скобки. Помещение пустого оператора (;) после метки case тоже работает. Причина ошибки и причина того, почему оба решения работают, заключается в том, что метка, включая метку case, может только предшествовать оператору. Объявления не являются операторами в C (C99 §6.7, §6.8, §6.8.2) и Objective-C, поэтому вы не можете поставить метку непосредственно перед объявлением. Таким образом, решения: либо поместите оператор (например, ; или NSLog(@"");) между меткой и объявлением, либо заключите объявление в составной оператор (скобки) после метки. - person Peter Hosey; 10.01.2010
comment
Спасибо, этот ответ поможет - person inix; 29.03.2015

Вы не можете объявить переменную в качестве первого оператора в case без скобок и во многих других контекстах языков на основе C. Подробнее см. Объявление переменных внутри оператора switch.

person Quinn Taylor    schedule 10.01.2010