【发布时间】:2021-02-16 08:49:44
【问题描述】:
当我在另一个嵌套函数中调用蹦床嵌套函数时,蹦床嵌套函数无法访问蹦床变量,在本例中为浮点数,r。
typedef void (*callback)();
callback Wrapper(float r) {
auto void foo();
void foo() {
// do something with r.
}
return &foo;
}
int main(void)
{
callback c = Wrapper(0.1);
auto void foo2();
void foo2() {
c(); // doesn't work unless i don't use r in foo (Segmentation fault (core dumped))
}
foo2();
c(); // works fine.
return 0;
}
【问题讨论】:
-
嵌套函数不是标准的 C 特性。所以最好不要使用它们。
-
取决于上下文。如果出于某种原因承诺使用非标准的东西。例如。团队所有的人都使用 gcc 工具链,那么使用 gcc 扩展呢(嵌套函数实际上就是这样的特性)?。
-
嗯,这大致就像访问其范围之外的局部变量...文档说 如果您在包含函数退出后尝试通过其地址调用嵌套函数,所有地狱都会崩溃。
-
也许你应该考虑切换到 C++17。它是一种非常复杂的语言,但它有 lambda expressions 和 std::function 并且非常小心,您可以用 C++ 编写一个可从 C 代码调用的库(例如 libgccjit...)
-
另一种方法是在运行时生成机器代码(可能生成 C 然后将其编译为插件)。发送电子邮件至
以获取详细信息和示例。在 Linux 上以 manydl.c 为例