Недавно я узнал, что gcc разрешает определение вложенной функции. На мой взгляд, это классная функция, но мне интересно, как ее реализовать.
В то время как нетрудно реализовать прямые вызовы вложенных функций, передав указатель контекста в качестве скрытого аргумента, gcc также позволяет взять указатель на вложенную функцию и передать этот указатель на произвольную другую функцию, которая, в свою очередь, может вызовите вложенную функцию контекста. Поскольку функция, вызывающая вложенную функцию, имеет только тип вложенной функции для вызова, она явно не может передать указатель контекста.
Я знаю, что другие языки, такие как Haskell, которые имеют более запутанное соглашение о вызове, позволяют частичному приложению поддерживать такой материал, но я не вижу возможности сделать это на C. Как это возможно реализовать?
Вот небольшой пример случая, который иллюстрирует проблему:
int foo(int x,int(*f)(int,int(*)(void))) {
int counter = 0;
int g(void) { return counter++; }
return f(x,g);
}
Эта функция вызывает функцию, вызывающую функцию, которая возвращает счетчик из контекста и одновременно увеличивает его.