我想我会失明,因为我无法弄清楚此代码中语法错误的位置:
if( cell == nil ) {
titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero
reuseIdentifier:CellIdentifier ] autorelease
];
switch( cellNumber ) {
case 1:
NSString *viewDataKey = @"Name";
etc...
当我尝试编译它时,我在最后一行的'*'token 之前收到错误:语法错误。
对不起这个基本问题,但我错过了什么?
答案 0 :(得分:69)
我手边没有合适的Objective-C编译器,但只要C构造相同:
switch { … }
为您提供一个块级范围,而不是每个case
一个范围。在范围开头以外的任何地方声明变量是非法的,并且switch
内的特别是危险的,因为它的初始化可能会被跳过。
请执行以下任一方法解决问题吗?
NSString *viewDataKey;
switch (cellNumber) {
case 1:
viewDataKey = @"Name";
…
}
switch (cellNumber) {
case 1: {
NSString *viewDataKey = @"Name";
…
}
…
}
答案 1 :(得分:20)
您不能在case语句的开头声明变量。制作一个仅包含该测试用例的测试用例,您将得到相同的错误。
它与在块中间声明的变量无关 - 即使采用允许GCC在case语句开头接受声明的标准也是如此。似乎GCC将案例标签视为该行的一部分,因此不允许在那里进行声明。
一个简单的解决方法是在案例的开头添加分号,因此声明不在开头。
答案 2 :(得分:4)
在C中,您只能在任何非声明语句之前在块的开头声明变量。
{
/* you can declare variables here */
/* block statements */
/* You can't declare variables here */
}
在C ++中,您可以在需要的地方声明变量。
答案 3 :(得分:1)
在交换机块中声明变量可能无效吗?
答案 4 :(得分: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;
}
答案 5 :(得分:0)
如何解决警告:
1.在案例块的第一行插入一个;
2.在大括号内输入代码