编译错误:开关,“之前的期望表达式”


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块中的某处添加注释时,它曾经消失过
。Magic

Answers:


164

在普通C语言中,两种情况下都必须将其括在方括号中。我怀疑这可能会解决您的问题:

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

有关更多信息,请参见此SO问题

解决此问题的另一种方法是,像在上面的工作示例中所做的那样,在案例标签和第一个声明之间放置一条语句。有关更多信息,请参见评论和Quinn Taylor的答案。


1
有趣。没有尝试括号方法。
Eimantas 2010年

是的,这可以解决问题。我只是用xcode的代码填充来运行,而没有使用它们。谢谢。
罗斯,2010年

我之前遇到过这个问题,我自己使用{}解决了这个问题,很高兴看到它是正确的解决方案。为你+1。
David Wong,2010年

20
您不一定必须使用方括号。标签也可以使用空语句(;case。错误的原因以及两种解决方案均起作用的原因是,包括case标签在内的标签只能位于语句之前。声明不是C(C99§6.7,§6.8,§6.8.2)和Objective-C中的语句,因此您不能在声明前紧跟标签。因此,解决方案是:在标签和声明之间放置一个语句(例如;NSLog(@"");),或者将声明包装在标签后面的复合语句(方括号)内。
Peter Hosey 2010年

谢谢,这个答案有帮助
inix 2015年


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:
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.