【发布时间】:2016-09-25 20:35:34
【问题描述】:
我知道 C 不支持嵌套函数,它只是一个 gcc 扩展。但即便如此,这种行为还是很奇怪。
嵌套函数似乎只能调用一次;第二次调用会导致 SIGSEV,有时会导致 SIGILL。我想要堆栈等结构的嵌套函数。在堆栈上,我将能够定义诸如 pop、push 等函数,我将使用嵌套函数分配这些函数,这些函数将通过引用调用普通函数,我将得到这些函数。此函数类似于构造函数或初始化程序。但是这段代码足以模拟我的问题。
当 generate 函数将 innerFunction 赋值给 struct 时,第二次调用会导致错误。如果任务是测试功能,第二次调用就可以了。
请问哪里出了问题?在 gcc 文档中,它说只要你有内部函数地址,你就可以访问这个函数,并且嵌套函数可以访问上面定义的所有变量。
typedef struct A A;
struct A {
void (*foo)();
};
void test() {
printf("test\n");
}
void generate(A* a) {
void innerTest(){
test();
}
a->foo = &innerTest;
}
int main() {
A a;
generate(&a);
a.foo();
a.foo();
};
【问题讨论】:
-
你的问题是什么?我正确编译并执行了你的代码。
-
我相信嵌套函数是不符合标准的。即使它可能有效
-
documentation 实际上是说“如果你试图在包含函数退出后通过它的地址调用嵌套函数,一切都会崩溃。”
-
这段代码导致段错误并且只打印一次“test”。使用相同 gcc 版本的 c99 和 c11 进行测试。但是输出应该包含两次“测试”
-
GCC 手册有说明输出应该包含什么吗?如果您所看到的不是手册所说的,那么您与 GCC 开发人员有问题。 c99 和 c11 说“不要那样做”——你远远超出了他们的承诺。