2009-07-12 12 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型を使用すると、それを上げることができます。 –

+1

Cは、 'スイッチ/ case'のために不可欠のようなオブジェクトをサポートしており、それはここでの問題だった場合、私は別のエラーメッセージを期待したいです。 – ephemient

+0

のObjective-Cは、C99(およびC++)に従うと、あなたはどこでも変数を宣言することができ、またはあなただけのブロックの開始時に行うことができますか?あなたがブロックの始めにそれらを宣言するように制約されているなら、 '' case ': ''の' ':' 'の後ろに '' {''を置き、事件の終わりになる前に。 –

答えて

66

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

次のいずれかの問題が解決しますか?

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

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

wrt/'スコープの先頭以外の変数を宣言するのは不正です。これはC99では当てはまりません。 C99はこれを可能にし、 "制御が宣言を超えてジャンプする"ときの意味とそのような場合の宣言の値を定義します。 – johne

+0

どのオプションが問題を解決したかを示すのを忘れてしまいました。私は問題を解決するためにトップの1つを使用しました - あなたが素晴らしい議論をしていたように見えるので、私は第2の提案をテストしたとは思いません。 – JoBu1324

+0

これらの理由の詳細については、http://stackoverflow.com/questions/1231198 –

1

スイッチブロック内で変数を宣言することは有効ではないかもしれませんか?

私が手に適したObjective-Cのコンパイラを持っていないが、限り、Cの構造が同じであるよう
+0

私がチャックの答えに述べたように: 'switch(0){int i; } 'は有効なC89であり、Objective-CはCの本当のスーパーセットであり(C++とは異なります)、Objective-CではC(合法的に盗まれた識別子)のすべてが合法です。 – ephemient

20

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

これは、ブロックの途中で宣言された変数で行う必要はありません - でも、それはGCCがcase文の先頭に宣言を受け入れることはありませんことができます標準を採用します。 GCCはケースラベルをその行の一部として見ているので、そこでの宣言は認められません。

簡単な回避策は、宣言はスタート時ではありませんので、念の先頭にセミコロンを置くことです。

+1

False。 'switch(0){int i; } 'C89でも完全にコンパイルされます。 – ephemient

+0

偽ではありません。私はAragornの投稿からGCCを通してあなたのサンプルを実行し、同じエラーが発生しました。 – Chuck

+0

私は "case文の変数を宣言できません"ということは偽であると主張しています。私の前のコメントでGCCに小さな例を与えてみてください。 – ephemient

4

Cであなただけの任意の非宣言文の前にブロックの初めで変数を宣言することができます。

{ 
    /* you can declare variables here */ 

    /* block statements */ 

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

C++では、必要な場所で変数を宣言できます。警告を解決する方法

+0

'switch(1){case 0:int i = 1;ブレーク;デフォルト:/ * wtfはiですか? * /; } 'どこにでも変数を宣言することができますが、' switch'の内部は*危険です*。 – ephemient

+0

Visual Studio 2008でcファイルをコンパイルしています。 is - > error C2143:構文エラー: ';'がありません。 before 'type' =) – Aragorn

+0

C++のイニシャライザをスキップするのはCよりも危険です.MSVCはCコンパイラよりもC++コンパイラです。私はこのジャンクが気に入らないことに驚かない。 – ephemient

0

1.Insert 1 ;あなたのケースブロックの最初の行に

2.Putコードは、内部のあなたはswitch文の中に変数を作成することができます

1

ブレースその変数のスコープが定義されるようにブロック内に作成する必要があります。

例:

switch(number){ 

    case 1: 
     { 
      // Create object here 
      // object is defined only for the scope of this block 
     } 
     break; 
    case 2: 
     { 
      // etc. 
     } 
     break; 
    default: 
     break; 

} 
+0

これは非常に古い質問に対する新しい答えです。あなたの答えは、他人にはないものは何ですか? – JAL

+0

これは、受け入れられた回答に提示された第1のswitch文の代替であることを意味していました。投稿時には、2番目のswitch文のcase文でインラインでブラケットに気付かなかった。 – egarlock

関連する問題