iPhone開発をやるようになってから、ずっと気になっていた事があります。下記のコードが、コンパイラを通らないのです。
1 2 3 4 5 6 7 8 | int main() { int n; switch (n) { case 0: int x = 1; break; } } |
int x = 1;の所で、「error: expected expression before ‘int’」となります。
気がついた当時は、gccのObjective-Cコンパイラに、変数スコープルールのバグがあるのではないかと考えて、次のような回避コードを書いていました。
1 2 3 4 5 6 7 8 9 10 | int main() { int n; switch (n) { case 0: { int x = 1; } break; } } |
所がある日、次のようなコードがコンパイラを通る事に気がつきました。一瞬、目の錯覚かと。
1 2 3 4 5 6 7 8 9 | int main() { int n; switch (n) { case 0: ; int x = 1; break; } } |
念のため、最初のコードをC++コンパイラに通してビルドできる事を確認、さらにCコンパイラを試したら、エラーになりました。つまりObjective-Cではなく、C言語レベルで引っかかっていたのです(例はintですが、見つけた時はNSStringか何かでした)。
ここまできてやっと、caseラベルが変数宣言文をエラーにしていると気がつきました。次のコードは、Cコンパイラでエラーになります。
1 2 3 4 | int main() { test: int x = 1; } |
納得いかない仕様ですが、C99とC++の変数宣言には非互換があるという事になります。JISを当たってみましたが、それらしき制約を見つけられないです…

ピンバック: 【開発日記】もとまかさんチュートリアル第5回をやった « ITとiPhoneと俺
ピンバック: Switch文で謎のエラーが発生 | AYAHIME.JP