LINUX.ORG.RU

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

Исправление firkax, (текущая версия) :

При том что блок это новый фрейм

Нет. Это только в учебных теориях так.

Переменные из блока существуют только внутри блока.

Переменная из объявления в середине блока существует только в хвосте блока, а не во всём. Соответственно

вставить машкод для резервирования

(только не фрейма, а места для переменной) компилятор может прямо туда где она объявлена. Если мы хотим всё оптимизировать - то конечно придётся делать не то что два прохода, а вообще долго лазить по всему коду в произвольном порядке после предварительного составления графа исполнения, но это другая тема.

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

Что за несёшь? Зачем сломанный код мне пихаешь? При обнаружении объявления - ставим скобку и увеличиваем счётчик. При обнаружении конца блока - ставим все накопленные закрывающие.

#include <stdio.h>

int main () {
  int x = 1;

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

  { int y = 2;

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

(и кстати, такой код с явно указанными скобками хоть и некрасивый, но всё же приятнее, чем если бы int y было просто в середине алгоритма).

Хуже того (для твоей ложной теории), компиляторы всегда поддерживали код вида

int x = 10;
int a = f(x);
int b;

Где по факту кодогенерация начиналась до того, как компилятор просмотрит все объявления. И даже доп. фигурные скобки никто не требовал. Так что ограничение это - чисто декоративное, и именно для того, чтобы соблюсти чистоту кода. К слову, я такими объявлениями, как приведены выше, никогда не пользуюсь. Ведь код, кроме компилятора, читаю я сам, и такую кашу читать неудобно.

Исправление firkax, :

При том что блок это новый фрейм

Нет. Это только в учебных теориях так.

Переменные из блока существуют только внутри блока.

Переменная из объявления в середине блока существует только в хвосте блока, а не во всём. Соответственно

вставить машкод для резервирования

(только не фрейма, а места для переменной) компилятор может прямо туда где она объявлена. Если мы хотим всё оптимизировать - то конечно придётся делать не то что два прохода, а вообще долго лазить по всему коду в произвольном порядке после предварительного составления графа исполнения, но это другая тема.

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

Что за несёшь? Зачем сломанный код мне пихаешь? При обнаружении объявления - ставим скобку и увеличиваем счётчик. При обнаружении конца блока - ставим все накопленные закрывающие.

#include <stdio.h>

int main () {
  int x = 1;

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

  { int y = 2;

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

Хуже того (для твоей ложной теории), компиляторы всегда поддерживали код вида

int x = 10;
int a = f(x);
int b;

Где по факту кодогенерация начиналась до того, как компилятор просмотрит все объявления. И даже доп. фигурные скобки никто не требовал. Так что ограничение это - чисто декоративное, и именно для того, чтобы соблюсти чистоту кода. К слову, я такими объявлениями, как приведены выше, никогда не пользуюсь. Ведь код, кроме компилятора, читаю я сам, и такую кашу читать неудобно.

Исходная версия firkax, :

При том что блок это новый фрейм

Нет. Это только в учебных теориях так.

Переменные из блока существуют только внутри блока.

Переменная из объявления в середине блока существует только в хвосте блока, а не во всём. Соответственно

вставить машкод для резервирования

(только не фрейма, а места для переменной) компилятор может прямо туда где она объявлена.

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

Что за несёшь? Зачем сломанный код мне пихаешь? При обнаружении объявления - ставим скобку и увеличиваем счётчик. При обнаружении конца блока - ставим все накопленные закрывающие.

#include <stdio.h>

int main () {
  int x = 1;

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

  { int y = 2;

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

Хуже того (для твоей ложной теории), компиляторы всегда поддерживали код вида

int x = 10;
int a = f(x);
int b;

Где по факту кодогенерация начиналась до того, как компилятор просмотрит все объявления. И даже доп. фигурные скобки никто не требовал. Так что ограничение это - чисто декоративное, и именно для того, чтобы соблюсти чистоту кода. К слову, я такими объявлениями, как приведены выше, никогда не пользуюсь. Ведь код, кроме компилятора, читаю я сам, и такую кашу читать неудобно.