Переменные все еще должны быть объявлены перед использованием - и их никогда не приходилось объявлять только в верхней части функции.
Требование 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. Возможно, это немного облегчило работу компилятора. (Я думал, что это облегчит разбор, но я не думаю, что так будет; все равно нужно уметь различать, является ли что-то объявлением или утверждением, не зная заранее из контекста.)