为什么编译器允许自己初始化变量?

时间:2013-04-19 17:44:54

标签: c

我终于追查了一个错字错误,这与下面的代码类似。 但编译器是否应该检测到这种情况(默认选项)?

#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

2 个答案:

答案 0 :(得分:7)

我不明白为什么它不会编译。定义在初始化之前发生。当然,这种初始化是没有意义的,但是,没有理由不能从编译器的角度来看它。

C与C#等更现代的语言没有相同类型的保护。 C#编译器会给出一个错误,即您正在使用未分配的变量。 C不关心。它不会保护你自己。

答案 1 :(得分: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;
}

通常,诊断何时使用未初始化的值是一个难题;虽然有些编译器在某些情况下可以检测到它,但要求它发生是没有意义的。