web-dev-qa-db-ja.com

Objective-Cのswitchステートメント内で変数を宣言できますか?

構文エラーがこのコードのどこにあるのかわからないので、私は盲目になると思います。

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

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

コンパイルしようとすると、最終行にError:syntax error before '*' tokenが表示されます。

そのような基本的な質問で申し訳ありませんが、何が欠けていますか?

57
JoBu1324

手元に適切なObjective-Cコンパイラはありませんが、C構造が同一である限り:

switch { … }oneブロックレベルのスコープを提供し、caseごとに1つではありません。スコープの先頭以外の場所で変数を宣言することは不正であり、switchの内部は特に初期化がジャンプする可能性があるため危険です以上。

次のいずれかで問題は解決しましたか?

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

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

ケースステートメントの先頭で変数を宣言することはできません。それだけで構成されるテストケースを作成すると、同じエラーが発生します。

ブロックの途中で宣言されている変数とは関係ありません。GCCがcaseステートメントの最初の宣言を受け入れないようにする標準を採用していてもかまいません。 GCCはケースのラベルを行の一部と見なしているため、そこでの宣言は許可されないようです。

簡単な回避策は、ケースの先頭にセミコロンを置くだけで、宣言が最初にないようにすることです。

20
Chuck

Cでは、非宣言ステートメントの前のブロックの先頭でのみ変数を宣言できます。

{
   /* you can declare variables here */

   /* block statements */

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

C++では、必要な場所で変数を宣言できます。

4
Aragorn

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

スイッチブロック内で変数を宣言するのは有効ではないのではないでしょうか。

1
Phil Miller

警告を解決する方法:

1. 1つ挿入;ケースブロックの最初の行

2.中括弧内にコードを置く

0
lin zheng