ホーム > 開発 > C99とC++の変数宣言の非互換

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

iPhone開発をやるようになってから、ずっと気になっていた事があります。下記のコードが、コンパイラを通らないのです。

int main() {
    int n;
    switch (n) {
        case 0:
            int x = 1;
        break;
    }
}

int x = 1;の所で、「error: expected expression before ‘int’」となります。

気がついた当時は、gccのObjective-Cコンパイラに、変数スコープルールのバグがあるのではないかと考えて、次のような回避コードを書いていました。

int main() {
    int n;
    switch (n) {
        case 0:
            {
                int x = 1;
            }
        break;
    }
}

所がある日、次のようなコードがコンパイラを通る事に気がつきました。一瞬、目の錯覚かと。

int main() {
    int n;
    switch (n) {
        case 0:
            ;
            int x = 1;
        break;
    }
}

念のため、最初のコードをC++コンパイラに通してビルドできる事を確認、さらにCコンパイラを試したら、エラーになりました。つまりObjective-Cではなく、C言語レベルで引っかかっていたのです(例はintですが、見つけた時はNSStringか何かでした)。

ここまできてやっと、caseラベルが変数宣言文をエラーにしていると気がつきました。次のコードは、Cコンパイラでエラーになります。

int main() {
test:
    int x = 1;
}

納得いかない仕様ですが、C99とC++の変数宣言には非互換があるという事になります。JISを当たってみましたが、それらしき制約を見つけられないです…

広告
カテゴリー:開発 タグ:

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。