9

最後に、次のコードのようなタイプミスのバグを突き止めました。しかし、コンパイラはこれを検出すべきではありませんか (デフォルトのオプションで)?

#include <stdio.h>

int main()
{
    int c = c;
    return printf("%d\n", c);
}


$ gcc --version        
gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
4

2 に答える 2

7

コンパイルできない理由がわかりません。定義は初期化の前に行われます。もちろん、この初期化は無意味ですが、コンパイラの観点からは機能しない理由はありません。

C には、C# などの最新の言語と同じ種類の保護がありません。C# コンパイラは、割り当てられていない変数を使用しているというエラーを出します。C 気にしない。それはあなた自身からあなたを守りません。

于 2013-04-19T17:48:58.397 に答える
3

独自の初期化子で変数を使用することは完全に正当です。リンクされたリストを考えてみましょう:

#include <stdio.h>
struct node { struct node *prev, *next; int value; };
int main() {
    struct node l[] = {{0, l + 1, 42}, {l, l + 2, 5}, {l, 0, 99}};
    for (struct node *n = l; n; n = n->next)
        printf("%d\n", n->value);
    return 0;
}

一般に、値が初期化されていない状態で使用されている場合の診断は難しい問題です。場合によってはそれを検出できるコンパイラもありますが、それを要求しても意味がありません。

于 2013-04-19T19:36:57.327 に答える