C - 在函数内声明一个函数并返回它
C - Declaring a function within a function and returning it
我有以下代码:
ll_data_comp sh_program_comp(int pid) {
int comp(void* d) {
sh_program_t* p = d;
return p->pid == pid;
}
return comp;
}
- 由于
comp
是在sh_program_comp
中声明的,这是否意味着它是在堆栈上声明的?
- 如果是这样,是否意味着返回后使用它可能会出现段错误?
- 如果没有,是否意味着我必须在某个地方释放
comp
?
I have the following code:
并且您已经用 C99
标记了您的问题。以下代码无效 - 无法在块范围内定义函数。
代码可以用 GNU gcc 编译器编译,Nested Functions 扩展 C 语言。但是从文档中:
If you try to call the nested function through its address after the containing function exits, all hell breaks loose.
如果您尝试在 sh_program_comp
之后调用 comp
函数,将打开通往地狱的门户。请不要这样做。
Nested functions are a GCC extension to C. 根据文档,您可以通过传递指向嵌套函数的指针从包含函数的范围之外调用嵌套函数,但只有在包含函数退出时才支持这种方式。包含函数的变量对嵌套函数可见。
… on the stack?
我希望嵌套函数的机器代码放在机器代码通常的位置,即“文本”段。将它放入堆栈会很困难。
您使用 c99 标记了它,但没有使用任何编译器。请注意,根据 c99(以及更早和更高版本),这甚至不是有效的 C 代码。或者,C 标准允许这些扩展,但不强制执行它们。但是这里没有适用的 C 标准。
但是一些编译器提供了这个扩展。因此,这种扩展的行为完全取决于编译器。
此外,C 标准甚至根本没有提及堆栈。通常,出于非常实际的原因,局部变量最终在堆栈上和堆上动态分配,但 C 标准没有说明什么。因此,即使这段代码是有效的 C,您的问题在一般意义上仍然无法回答,因为它完全取决于实现。
函数嵌套是一个 GCC 扩展(仅对 C 有效)如果您查看 ,您会在那里读到为什么您的函数一旦作用域无效它的完成(包含函数返回)更多如果它访问(或被使用,因为你在这里使用它,在原始答案中)封闭函数的本地数据,一旦封闭函数完成,它就不存在了。
我有以下代码:
ll_data_comp sh_program_comp(int pid) {
int comp(void* d) {
sh_program_t* p = d;
return p->pid == pid;
}
return comp;
}
- 由于
comp
是在sh_program_comp
中声明的,这是否意味着它是在堆栈上声明的? - 如果是这样,是否意味着返回后使用它可能会出现段错误?
- 如果没有,是否意味着我必须在某个地方释放
comp
?
I have the following code:
并且您已经用 C99
标记了您的问题。以下代码无效 - 无法在块范围内定义函数。
代码可以用 GNU gcc 编译器编译,Nested Functions 扩展 C 语言。但是从文档中:
If you try to call the nested function through its address after the containing function exits, all hell breaks loose.
如果您尝试在 sh_program_comp
之后调用 comp
函数,将打开通往地狱的门户。请不要这样做。
Nested functions are a GCC extension to C. 根据文档,您可以通过传递指向嵌套函数的指针从包含函数的范围之外调用嵌套函数,但只有在包含函数退出时才支持这种方式。包含函数的变量对嵌套函数可见。
… on the stack?
我希望嵌套函数的机器代码放在机器代码通常的位置,即“文本”段。将它放入堆栈会很困难。
您使用 c99 标记了它,但没有使用任何编译器。请注意,根据 c99(以及更早和更高版本),这甚至不是有效的 C 代码。或者,C 标准允许这些扩展,但不强制执行它们。但是这里没有适用的 C 标准。
但是一些编译器提供了这个扩展。因此,这种扩展的行为完全取决于编译器。
此外,C 标准甚至根本没有提及堆栈。通常,出于非常实际的原因,局部变量最终在堆栈上和堆上动态分配,但 C 标准没有说明什么。因此,即使这段代码是有效的 C,您的问题在一般意义上仍然无法回答,因为它完全取决于实现。
函数嵌套是一个 GCC 扩展(仅对 C 有效)如果您查看