Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I declare variables inside an Objective-C switch statement?

I think I'm going blind, because I can't figure out where the syntax error is in this code:

if( cell == nil ) {     titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero         reuseIdentifier:CellIdentifier ] autorelease     ];      switch( cellNumber ) {         case 1:             NSString *viewDataKey = @"Name"; etc... 

When I try to compile it, I'm getting an Error: syntax error before '*' token on the last line.

Sorry for such a basic question, but what am I missing?

like image 218
JoBu1324 Avatar asked Jul 12 '09 04:07

JoBu1324


People also ask

Can you declare variables in a switch-case C?

Do not declare variables inside a switch statement before the first case label. According to the C Standard, 6.8.

Can you declare variable inside switch statement?

Declaring a variable inside a switch block is fine. Declaring after a case guard is not.

Which variable is not allowed in switch statement?

The switch statement doesn't accept arguments of type long, float, double,boolean or any object besides String.


2 Answers

I don't have a suitable Objective-C compiler on hand, but as long as the C constructs are identical:

switch { … } gives you one block-level scope, not one for each case. Declaring a variable anywhere other than the beginning of the scope is illegal, and inside a switch is especially dangerous because its initialization may be jumped over.

Do either of the following resolve the issue?

NSString *viewDataKey; switch (cellNumber) {     case 1:         viewDataKey = @"Name";     … }  switch (cellNumber) {     case 1: {         NSString *viewDataKey = @"Name";         …     }     … } 
like image 96
ephemient Avatar answered Sep 23 '22 23:09

ephemient


You can't declare a variable at the beginning of a case statement. Make a test case that just consists of that and you'll get the same error.

It doesn't have to do with variables being declared in the middle of a block — even adopting a standard that allows that won't make GCC accept a declaration at the beginning of a case statement. It appears that GCC views the case label as part of the line and thus won't allow a declaration there.

A simple workaround is just to put a semicolon at the beginning of the case so the declaration is not at the start.

like image 20
Chuck Avatar answered Sep 22 '22 23:09

Chuck