#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.
Комментариев нет:
Отправить комментарий