c - C中的假匿名函数

标签 c anonymous-function

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/

相关文章:

c - Webassembly 上的 UDP 套接字

java - C 和 Java 在变量方面的区别?

c - 我这样做对吗?将结构中的指针映射到结构外部以供 IPC 共享内存使用

php - 为什么要使用匿名函数?

javascript - 用命名函数替换匿名函数(在 jQuery 中)

c - .txt 文件中的动态多维数组

c - 2 C 枚举问题

python - 如何在Dart中创建某些类类型的对象的列表?

c++ - 匿名函数, "Parse Issue: Expected Expression"

javascript - 如何在匿名函数调用中获取外循环索引?