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 回答