我终于追查了一个错字错误,这与下面的代码类似。 但编译器是否应该检测到这种情况(默认选项)?
#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
答案 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;
}
通常,诊断何时使用未初始化的值是一个难题;虽然有些编译器在某些情况下可以检测到它,但要求它发生是没有意义的。