Реализация вложенных функций

Недавно я узнал, что 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);
}

Эта функция вызывает функцию, которая вызывает функцию, которая возвращает счетчик из контекста и одновременно увеличивает его.

26
задан River 18 October 2017 в 03:07
поделиться