最近,我不得不修改使用非常旧版本的GCC(2.3版本左右)编译的遗留代码。在函数中,变量必须在使用之前声明。我相信这是C89标准。稍后会删除此限制。
我的问题是:那时候,他们为什么要执行这项裁决?是否存在任何可能危及软件完整性的问题?
答案 0 :(得分:9)
变量仍然必须在使用之前声明 - 并且它们永远不必在函数的顶部声明。
C89要求是一个块包含一个开头{
,后跟零个或多个声明,后跟零个或多个语句,然后是结束}
。
例如,这是合法的C89(并且,没有void
,甚至K& R C,可以追溯到1978年或更早版本):
int foo(void) {
int outer = 10;
{
int inner = 20;
printf("outer = %d, inner = %d\n", outer, inner);
}
printf("outer = %d, inner is not visible\n", outer);
return 0;
}
C99放宽了这一点,允许声明和语句在一个块中混合:
int foo(void) {
int x = 10;
printf("x = %d\n", x);
int y = 20;
printf("y = %d\n", y);
return 0;
}
至于原始限制的原因,我认为它可以追溯到C的祖先语言:B,BCPL,甚至是Algol。它可能确实使编译器的工作更容易一些。 (我当时认为它会使解析变得更容易,但我认为它不会;它仍然必须能够在不事先了解上下文的情况下区分某些事物是声明还是声明。)
答案 1 :(得分:4)
主要是为了使编译器更容易编写。如果所有声明都在函数的顶部,那么编译器很容易解析所有本地并确定需要多少堆栈。
当然,编译器比30年前更加成熟。所以摆脱这种限制是有道理的,因为它对程序员来说是一种麻烦。