我想创建一个通用函数,它返回一个函数指针,指向C/C++中的另一个函数.但是,第二个返回的函数应该能够使用第一个函数的变量.
例,
typedef double (*func_t)(double);
func_t inverse(func_t fn) {
// define another function here that uses fn
double solve(double x) {
// use fn
}
return &solve;
}
double sqr(double x) { return x * x; }
int main() {
func_t inv = inverse(sqr);
printf("sqrt %d = %f\n", 100, inv(100));
}
Run Code Online (Sandbox Code Playgroud)
显然gcc,g ++不允许我这样做.我可以在不使用类或结构的情况下实现此目的.
回答C:
C不支持嵌套函数(在另一个函数内定义函数),但gcc允许它作为C的GNU扩展.
http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html
这不是嵌套函数; 这是关闭.GCC的嵌套函数是一种半实现的闭包形式,不能满足问题的要求.
C,按照任何标准,根本不支持闭包.
C++ 11通过lambdas支持闭包,还有一些特定于C++的其他解决方案.
苹果锵编译器不支持关闭在C模式的延伸,在"块"的形式.与嵌套函数不同,这些函数实际上适用于请求的用例(即返回到更高的调用级别).
你会写出这样的东西:
typedef double (^func_t)(double); // block type is slightly different from function pointer
func_t inverse(func_t fn) {
return ^ double(double x) {
//use fn
};
}
// ...etc., same from here
Run Code Online (Sandbox Code Playgroud)
但是如果你想大量使用闭包,你真的需要使用不同的语言.由于缺乏任何类型的内存管理,您将在C中遇到严重的并发症(无限制的闭包是手工管理的噩梦).
在c中的函数内定义函数?
称为嵌套函数。
嵌套函数不是ANSI C的一部分,但是,它们是 Gnu C的一部分。
来自维基百科
支持词法嵌套函数的知名语言包括:
基于 ALGOL 的语言,例如 ALGOL 68、Simula、Pascal、Modula-2、Modula-3、Oberon、Seed7 和 Ada。
Lisp 的现代版本(具有词法范围),例如Scheme 和Common Lisp。
ECMAScript(JavaScript 和 ActionScript)。
Scala(完全支持)
对 Ruby、Python、Perl 等脚本语言(从版本 6 开始)的不同程度的支持。
标准C和C++不支持嵌套函数,但是:GCC支持C中的嵌套函数,作为语言扩展。
与 C 相关的 D 语言具有嵌套函数。
Fortran,从 Fortran-90 开始,支持一级嵌套(CONTAINed)子例程和函数。
MATLAB(完全支持)
GNU C 语法示例(带有嵌套函数的 C 扩展):
float E(float x)
{
float F(float y)
{
return x + y;
}
return F(3) + F(4);
}
Run Code Online (Sandbox Code Playgroud)