#c #функции
1) Являются ли вложенные функции исключительно расширением компиляторов, или же они появились в стандарте C11? 2) Вложенная функция имеет доступ ко всему, что лежит перед ней в ее области определения. С одной стороны, это удобно, получается нечто, напоминающее лямбды, но с другой стороны - появляются сколькие проблемы. Например, такие: void a(const int _i) { void b(void) { printf("_i: %i", _i); } } // Технически, мы можем вызвать b() за пределами a(), // но тогда непонятно, к чему мы обратимся, используя _i. Я хотел бы разобраться, что можно делать с такими функциями, а что нельзя. PS. Понятно, что вложенные функции опасны и имеют неочевидные подводные камни, но в некоторых случаях альтернативные решения еще хуже (например, макросы). В определенных ситуациях бывает удобно вынести повторяющиеся действия во вложенные функции. Или, к примеру, задать обработчик прямо перед его использованием, например так: FILE *f = fopen("data", "wb"); // ... void handler(void *_n) { list_node *n = (list_node*)_n; fwrite(n->data, n->size, 1, f); } list_for_each(list, handler);
Ответы
Ответ 1
Это расширение gcc: https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html Имя вложенной функции имеет локальную область видимости, т.е. нельзя вызвать b за пределами a.
Комментариев нет:
Отправить комментарий