Ожидаемая ошибка выражения при определении переменной в выражении switch в Objective-C [duplicate]

Элемент, запускающий код сценария, передается в код. Нет необходимости искать его снова.

Sub RunAScript_code(item As Outlook.MailItem)

    MsgBox "The item that triggered this code is: " & item.subject

End Sub
54
задан Jim Puls 12 July 2009 в 06:13
поделиться

6 ответов

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

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

Выполните одно из следующих действий решить проблему?

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

switch (cellNumber) {
    case 1: {
        NSString *viewDataKey = @"Name";
        …
    }
    …
}
66
ответ дан ephemient 25 August 2018 в 09:41
поделиться
  • 1
    wrt / Declaring a variable anywhere other than the beginning of the scope is illegal. Это не так на C99. C99 оба допускают это и определяют семантику того, что происходит, когда «управление переходит под объявлением», и значение этой декларации в таких случаях. – johne 25 July 2009 в 04:46
  • 2
    Я забыл указать, какой вариант решил проблему, oops. Я использовал верхнюю часть для решения проблемы - я не думаю, что тестировал второе предложение, что слишком плохо, потому что вы, ребята, выглядите так, как будто у вас отличная дискуссия! – JoBu1324 3 September 2009 в 09:35
  • 3
    Подробнее о том, почему они работают в stackoverflow.com/questions/1231198 – Quinn Taylor 13 September 2011 в 05:56

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

{
   /* you can declare variables here */

   /* block statements */

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

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

4
ответ дан Aragorn 25 August 2018 в 09:41
поделиться
  • 1
    switch (1) { case 0: int i = 1; break; default: /* wtf is i? */; } Даже если вы можете объявлять переменные везде, внутри switch опасно . – ephemient 12 July 2009 в 05:46
  • 2
    с Visual Studio 2008 компиляция c-файла. - - & gt; ошибка C2143: синтаксическая ошибка: отсутствует ';' до 'type' =) – Aragorn 12 July 2009 в 06:00
  • 3
    Пропуск инициализаторов в C ++ еще более опасен, чем в C, а MSVC - скорее компилятор C ++, чем компилятор C. Я не удивлен, что ему не нравится этот хлам. – ephemient 12 July 2009 в 06:07
  • 4
    В режиме C (/ TC) он дает ошибку, а в режиме C ++ (/ TP) он компилируется без ошибок. знак равно – Aragorn 12 July 2009 в 06:16

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

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

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

20
ответ дан Chuck 25 August 2018 в 09:41
поделиться
  • 1
    Ложь. switch (0) { int i; } отлично компилируется даже на C89. – ephemient 12 July 2009 в 05:39
  • 2
    Не ложно. Я просто провел ваш пример с сообщения Арагорна через GCC и получил ту же ошибку. – Chuck 12 July 2009 в 05:59
  • 3
    Я утверждаю, что & quot; не может объявить переменную в case case & quot; false. Попробуйте дать GCC крошечный пример в моем предыдущем комментарии. – ephemient 12 July 2009 в 06:05
  • 4
    О, я вижу, вы говорили о метке case, а не о switch. Смущение говорить о "начале" из него - case - это всего лишь метка , и как таковая может только маркировать утверждения. Это действительная точка. – ephemient 12 July 2009 в 06:24
  • 5
    Постер этого ответа правильный. Корень проблемы лежит в грамматике C99 BNF, которая (свободно) определяет помеченное выражение как: ...: statement. Короче говоря, нет способа получить от statement до declaration. A compound-statement (т. Е. { ... }) (слабо) определяет ... часть как zero or more block-items, с блочным элементом (свободно), определенным как statement or declaration. Кроме того, комментарий @Dan Olson ошибочен и не относится к C99, что очень четко определяет семантику смешанных объявлений и выражений wrt / initialization (C99 6.8.6.1 и т. Д.). – johne 25 July 2009 в 04:41

Вы можете создать переменную в инструкции 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
ответ дан egarlock 25 August 2018 в 09:41
поделиться
  • 1
    Это новый ответ на очень старый вопрос с принятым ответом. Что дает ваш ответ, а другие нет? – JAL 22 December 2016 в 21:41
  • 2
    Это должно было быть альтернативой заявлению 1-го переключателя, представленному в принятом ответе. Во время публикации я не заметил, что скобка встроена с оператором case во втором заявлении оператора. – egarlock 22 December 2016 в 21:53

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

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

2. Коды кода внутри фигурных скобок

0
ответ дан Jason Gao 25 August 2018 в 09:41
поделиться

Нельзя ли объявить переменную в блоке переключателя?

1
ответ дан Phil Miller 25 August 2018 в 09:41
поделиться
  • 1
    Как я заметил на ответ Чака: switch (0) { int i; } является допустимым C89, а Objective-C является истинным надмножеством C (в отличие от C ++), поэтому все законное в C (по модулю украденные идентификаторы) является законным в Objective-C. – ephemient 12 July 2009 в 05:41