Могу ли я объявить переменные внутри оператора переключения Objective C? - PullRequest
57 голосов
/ 12 июля 2009

Я думаю, что ослеп, потому что не могу понять, где находится синтаксическая ошибка в этом коде:

if( cell == nil ) {
    titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero
        reuseIdentifier:CellIdentifier ] autorelease
    ];

    switch( cellNumber ) {
        case 1:
            NSString *viewDataKey = @"Name";
etc...

Когда я пытаюсь его скомпилировать, я получаю Ошибка: синтаксическая ошибка перед токеном * в конце последней строки .

Извините за такой простой вопрос, но чего мне не хватает?

Ответы [ 6 ]

69 голосов
/ 12 июля 2009

У меня нет подходящего компилятора Objective-C под рукой, но пока конструкции C идентичны:

switch { … } дает вам одну область действия уровня блока, а не одну для каждого case. Объявление переменной в любом месте, кроме начала области, является недопустимым, и внутри switch это , особенно опасно, потому что ее инициализация может быть перепрыгнута.

Устранено ли одно из следующих действий?

NSString *viewDataKey;
switch (cellNumber) {
    case 1:
        viewDataKey = @"Name";
    …
}

switch (cellNumber) {
    case 1: {
        NSString *viewDataKey = @"Name";
        …
    }
    …
}
20 голосов
/ 12 июля 2009

Вы не можете объявить переменную в начале оператора case. Сделайте контрольный пример, который состоит только из этого, и вы получите ту же ошибку.

Это не имеет отношения к объявлению переменных в середине блока - даже принятию стандарта, который позволяет GCC не принимать объявление в начале оператора case. Похоже, что GCC рассматривает метку регистра как часть строки и, следовательно, не разрешает объявление там.

Простой обходной путь - просто поставить точку с запятой в начале кейса, чтобы объявление не было в начале.

4 голосов
/ 12 июля 2009

В C вы можете объявлять переменные только в начале блока перед любыми необъявленными операторами.

{
   /* you can declare variables here */

   /* block statements */

   /* You can't declare variables here */
}

В C ++ вы можете объявлять переменные в любом месте, где они вам нужны.

1 голос
/ 22 декабря 2016

Вы можете создать переменную в операторе switch, но вам придется создать ее внутри блока, чтобы определить область действия этой переменной.

Пример:

switch(number){

    case 1:
        {
            // Create object here
            // object is defined only for the scope of this block
        }
        break;
    case 2:
        {
            // etc.
        }
        break;
    default:
        break;

}
1 голос
/ 12 июля 2009

Может ли быть недопустимым объявление переменной в блоке переключателя?

0 голосов
/ 24 мая 2012

Как решить предупреждение:

1.Введите один ; в первую строку блока вашего дела

2.Поставить коды в фигурные скобки

...