在this SO线程,Brian Postow suggested涉及虚假匿名函数的解决方案:
make a comp(L) function that returns the version of comp for arrays of length L... that way L becomes a parameter, not a global
如何实现这样的功能?
最佳答案
参见 the answer I just posted那个问题。您可以使用 callback(3)
在运行时生成新函数的库。它不符合标准,因为它涉及许多丑陋的特定于平台的 hack,但它确实适用于大量系统。
该库负责分配内存,确保内存可执行,并在必要时刷新指令缓存,以确保动态生成的代码(即闭包)可执行。它本质上会生成在 x86 上可能看起来像这样的代码 stub :
pop %ecx
push $THUNK
push %ecx
jmp $function
THUNK:
.long $parameter
然后返回第一条指令的地址。这个 stub 所做的是将返回地址存储到 ECX(x86 调用约定中的临时寄存器),将一个额外的参数压入堆栈(指向 thunk 的指针),然后重新压入返回地址。然后,它跳转到实际函数。这导致该函数误认为它有一个额外的参数,即闭包的隐藏上下文。
其实比这更复杂( stub 末尾实际调用的函数是__vacall_r
,而不是函数本身,__vacall_r()
处理了更多的实现细节), 但这是基本原则。
关于c - C中的假匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1650379/