29

私は最近、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);
}

この関数は、コンテキストからカウンターを返す関数を呼び出す関数を呼び出し、同時にそれをインクリメントします。

4

1 に答える 1