Объявление переменных перед использованием в старом C - PullRequest
2 голосов
/ 26 сентября 2011

Недавно мне пришлось изменить устаревший код, который был скомпилирован с очень старой версией GCC (где-то около версии 2.3). Внутри функции переменная должна быть объявлена ​​перед использованием. Я считаю, что это сделано стандарт C89. Это ограничение позже снято.

Мой вопрос таков: почему тогда они применяли это решение? Была ли какая-либо проблема, которая могла бы поставить под угрозу целостность программного обеспечения?

Ответы [ 2 ]

9 голосов
/ 26 сентября 2011

Переменные все еще должны быть объявлены перед использованием - и их никогда не приходилось объявлять только в верхней части функции.

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

4 голосов
/ 26 сентября 2011

Главным образом, чтобы было проще писать компиляторы.Если бы все объявления были в верхней части функции, компилятору было бы легко проанализировать все локальные переменные и определить, какой объем стека необходим.

Конечно, сейчас компиляторы намного более развиты, чембыли 30 лет назад.Поэтому имеет смысл избавиться от этого ограничения, так как это стало неприятностью для программистов.

...