我终于找到了一个错字错误,类似于以下代码。但是编译器不应该检测到这个(默认选项)吗?
#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
我终于找到了一个错字错误,类似于以下代码。但是编译器不应该检测到这个(默认选项)吗?
#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
我不明白为什么它不会编译。定义发生在初始化之前。当然,这种初始化是没有意义的,但是,从编译器的角度来看,它没有理由不起作用。
C 没有像 C# 这样更现代的语言所具有的相同类型的保护。C# 编译器会给出错误,表明您正在使用未分配的变量。C不在乎。它不会保护你免受自己的伤害。
在自己的初始化程序中使用变量是完全合法的。考虑一个链表:
#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;
}
一般来说,诊断何时使用未初始化的值是一个难题。尽管某些编译器在某些情况下可以检测到它,但要求它发生是没有意义的。