アーカイブ

Posts Tagged ‘C/C++’

C言語のswitch文でcaseラベル単位にブロックを導入する時の奇麗なインデント

現代的なC言語のスタイルでは、変数のスコープは最小化するべきだと考えています。
所がこの方針でコーディングを行うと、switch文のインデントが残念な見栄えになる事が多いのではないかと思います。

長い間下記の様に書いていましたが、インデントが深過ぎると感じていました。しかも、自動インデントで奇麗に整形できないようです(少なくてもXcode4では)。

switch (i) {
    case 0:
        {
            ~
        }
        break;
    case 1:
        {
            ~
        }
        break;
}

最近、次のような書き方を思いつきました。これはインデントも浅く、自動インデントも問題ありません。

switch (i) {
    case 0: {
        ~
        break;
    }
    case 1: {
        ~
        break;
    }
}

break文をブロックの中に入れる所がポイントです。

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

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

2009年9月7日 2件のコメント

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

カテゴリー:開発 タグ: