LINUX.ORG.RU

История изменений

Исправление no-such-file, (текущая версия) :

Причём тут контекст и стекфреймы

При том что блок это новый фрейм. Переменные из блока существуют только внутри блока. Внезапно. И чтобы знать размер этого фрейма компилятор должен до начала кода блока знать все переменные и вставить машкод для резервирования фрейма. Поэтому либо они должны быть описаны в начале блока, либо надо делать два прохода: один чтобы найти все декларации, а второй чтобы собственно скомпилять код.

Это гарантированно работает всегда

Это вообще не работает

#include <stdio.h>

int main () {
  int x = 1;

  printf("%d\n", x);

  { int y = 2; }

  printf("%d\n", y);
}

test.c: In function ‘main’:
test.c:10:18: error: ‘y’ undeclared (first use in this function)
   10 |   printf("%d\n", y);
      |                  ^

Исправление no-such-file, :

Причём тут контекст и стекфреймы

При том что блок это новый фрейм. Переменные из блока существуют только внутри блока. Внезапно. И чтобы знать размер этого фрейма компилятор должен до начала кода блока знать все переменные и вставить машкод для резервирования фрейма. Поэтому либо они должны быть описаны в начале блока, либо надо делать два прохода: один чтобы найти все декларации, а второй чтобы собственно скомпилять код.

Это гарантированно работает всегда

Это вообще не работает

#include <stdio.h>

int main () {
  int x = 1;
  {
    int y = 2;
  }

  printf("%d\n", y);
}

gcc test.c
test.c: In function ‘main’:
test.c:9:18: error: ‘y’ undeclared (first use in this function)
    9 |   printf("%d\n", y);
      |                  ^
test.c:9:18: note: each undeclared identifier is reported only once for each function it appears in

Исходная версия no-such-file, :

Причём тут контекст и стекфреймы

При том что блок это новый фрейм. Переменные из блока существуют только внутри блока. Внезапно. И чтобы знать размер этого фрейма компилятор должен до начала кода блока знать все переменные и вставить машкод для резервирования фрейма. Поэтому либо они должны быть описаны в начале блока, либо надо делать два прохода: один чтобы найти все декларации, а второй чтобы собственно скомпилять код.