在旧C中使用之前声明变量

fre*_*nix 2 c gcc c89

最近我不得不修改用旧版本的GCC编译的遗留代码(在2.3版左右).在函数中,变量必须在使用之前声明.我相信这是C89标准.此限制稍后被删除.

我的问题是:那时候,他们为什么要执行这项裁决呢?是否存在可能危及软件完整性的问题?

Kei*_*son 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;
}
Run Code Online (Sandbox Code Playgroud)

C99放松了这一点,允许声明和语句在一个块中混合:

int foo(void) {
    int x = 10;
    printf("x = %d\n", x);
    int y = 20;
    printf("y = %d\n", y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

至于原始限制的原因,我认为它可以追溯到C的祖先语言:B,BCPL,甚至是Algol.它可能确实使编译器的工作更容易一些.(我当时认为它会使解析变得更容易,但我认为它没有;它仍然必须能够在不事先了解上下文的情况下区分某些事物是声明还是声明.)