Кложуребесие-3+: Нет таких крепостей, которых большевики не могли бы взять
Ну и так сказать бонус-трек:
При трансляции GNU C это и транслируется и работает - более того работает правильно и так и должно быть.
Вопрос - "как?". Проблемка понятно что в том, что в С хошь-ни-хошь, а указатель на функцию двухсловным не сделаешь. Указатель - он и есть указатель.
Ну на сам деле очень просто: в функции (в данном случае main) для вложенной функции add_sqr прямо в стеке генерируется так называемый "трамплин" - исполняемый переходник который в нужный регистр при вызове подсовывает уже в момент вызова функции main известную базу для add_sqr. И указателем на функцию является не адрес собственно кода add_sqr, а адрес трамплина :)
PS: Могучую тему goto ведущих из вложенной функции вовне я оставляю без рассмотрения - ибо тема хоть и разработанная во всех упомянутых языках - но кажется совершенно бесплодная: то есть оно работает - но "кому это надо и кто это выдержит" вопрос открыт...
# include <stdio.h>
void loop (int l, int u, void (*body) (int)) {
for (int i = l; i != u; ++ i)
body (i);
}
int main () {
int sum = 0;
void add_sqr (int i) { sum += i * i; }
loop (1, 10, add_sqr);
printf ("sum=%d\n", sum);
return 0;
}
При трансляции GNU C это и транслируется и работает - более того работает правильно и так и должно быть.
Вопрос - "как?". Проблемка понятно что в том, что в С хошь-ни-хошь, а указатель на функцию двухсловным не сделаешь. Указатель - он и есть указатель.
Ну на сам деле очень просто: в функции (в данном случае main) для вложенной функции add_sqr прямо в стеке генерируется так называемый "трамплин" - исполняемый переходник который в нужный регистр при вызове подсовывает уже в момент вызова функции main известную базу для add_sqr. И указателем на функцию является не адрес собственно кода add_sqr, а адрес трамплина :)
PS: Могучую тему goto ведущих из вложенной функции вовне я оставляю без рассмотрения - ибо тема хоть и разработанная во всех упомянутых языках - но кажется совершенно бесплодная: то есть оно работает - но "кому это надо и кто это выдержит" вопрос открыт...