2009-07-12 126 views
54

我想我会失明,因为我无法揣摩出的语法错误是在此代码:我可以在Objective-C switch语句中声明变量吗?

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

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

当我尝试编译它,我发现了一个错误:语法错误在最后一行'*'标记之前。

对不起,这是一个基本的问题,但我错过了什么?

+1

什么样的变量是cellNumber? switch语句来自C语言,因此使用Objective-C类型可以将其启动。 – 2009-07-12 04:29:02

+1

C只支持`switch/case`类似于整数的对象,如果这是个问题,我期望得到一个不同的错误信息。 – ephemient 2009-07-12 04:32:44

+0

Objective-C是否遵循C99(和C++)并允许您在任何地方声明变量,或者只能在块的开始处这样做?如果你不得不在块的开始处声明它们,那么你可以在case'1'的``:''和匹配的'`}之后加一个``{`'来修正你的语法错误。 “在案件结束之前。 – 2009-07-12 04:35:45

回答

66

我不手头上有合适的目标C编译器,但只要C构造是相同的:

switch { … }给你一个块级范围,而不是为每个case。在范围的开头以外的任何地方声明一个变量是非法的,并且在switch内部是,特别是危险,因为它的初始化可能被跳过。

执行以下任一操作可以解决问题吗?

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

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

在switch块中声明一个变量可能不合适吗?

20

您不能在case语句开头声明一个变量。制作一个测试用例,并且你会得到相同的错误。

它不需要在块的中间声明变量 - 即使采用了一个标准,它不会让GCC在case语句开头接受声明。看来GCC将案例标签看作是该行的一部分,因此不会在那里进行声明。

一个简单的解决方法就是在该案例的开头处放一个分号,以便声明不在开头。

4

在C语言中,只能在任何非声明语句之前的块的开头声明变量。

{ 
    /* you can declare variables here */ 

    /* block statements */ 

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

在C++中,您可以在任何需要它们的地方声明变量。

0

如何解决警告:

1.Insert一个;你的情况块的第一行

2.Put码在大括号

1

您可以在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; 

} 
相关问题