C99とC++の変数宣言の非互換

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を当たってみましたが、それらしき制約を見つけられないです…

カテゴリー: Develop   パーマリンク

C99とC++の変数宣言の非互換 への2件のコメント

  1. ピンバック: 【開発日記】もとまかさんチュートリアル第5回をやった « ITとiPhoneと俺

  2. ピンバック: Switch文で謎のエラーが発生 | AYAHIME.JP

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">