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

79

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

это соответствует без ошибок:

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

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

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

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

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

Росс
источник
Я помню оператор switch / case с аналогичной ошибкой, он исчезал, когда я добавлял комментарий где-нибудь в блоке case .. Магия
Юнус Недим Мехель 06

Ответы:

164

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

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

См. Этот вопрос SO для получения дополнительной информации.

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

Дэн Олсон
источник
1
Интересно. Кронштейн не пробовал.
Eimantas
Да, это решает проблему. Я просто работал с заполнением кода xcode, который их не использует. Благодарю.
Росс
Я сталкивался с этой проблемой раньше, я сам решил ее с помощью {}, приятно видеть, что это правильное решение. +1 для тебя Дэн.
Дэвид Вонг
20
Вам не обязательно использовать скобки. Помещение пустого оператора ( ;) после caseметки тоже работает. Причина ошибки и причина того, почему оба решения работают, заключается в том, что метка, включая caseметку, может только предшествовать оператору. Объявления не являются операторами в C (C99 §6.7, §6.8, §6.8.2) и Objective-C, поэтому вы не можете поставить метку непосредственно перед объявлением. Таким образом, решения: либо поместите оператор (например, ;или NSLog(@"");) между меткой и объявлением, либо заключите объявление в составной оператор (скобки) после метки.
Питер Хози
Спасибо, этот ответ помог
inix
3
case 0: {
    Loading my nib file;
    break; 
}
case 1: {
    Loading another nib file;
    break; 
}
Note that if you don't have an assignment (x = y) right after the case it won't be a problem. For example:
Киран Кумар
источник