Помилка компіляції з: перемикач, “очікуваний вираз до”


79

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

це відповідає без помилок:

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

це компілюється з помилкою, і в ньому бракує лише NSLog ():

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

він видає помилку під час компіляції " Очікуваний вираз перед 'NSString' "

Мені чогось тут не вистачає?



Я пам’ятаю висловлювання комутатора / справи з подібною помилкою, воно колись зникало, коли я додавав коментар десь у блоці справи. Магія
Юнус Недім Мехель

Відповіді:


164

У звичайному C вам доведеться в обох випадках вводити це в дужки. Я підозрюю, що це може вирішити вашу проблему:

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

Дивіться це питання SO для отримання додаткової інформації.

Інший спосіб обійти цю проблему - поставити заяву між міткою справи та першою декларацією, як це зроблено у вашому робочому прикладі вище. Дивіться коментарі та відповідь Квін Тейлор для отримання додаткової інформації.


1
Цікаво. Не спробував підхід до дужок.
Еймантас

Так, це вирішує проблему. Я просто працював із заповненням коду 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:
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.