Страницы

Поиск по вопросам

понедельник, 16 декабря 2019 г.

Вложенные функции в C

#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.

Комментариев нет:

Отправить комментарий