在c中定义函数内部的函数

mor*_*zow 10 c c++

我想创建一个通用函数,它返回一个函数指针,指向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 ++不允许我这样做.我可以在不使用类或结构的情况下实现此目的.

oua*_*uah 5

回答C:

C不支持嵌套函数(在另一个函数内定义函数),但gcc允许它作为C的GNU扩展.

http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

  • 这个链接背后最相关的是:"如果你试图在包含函数退出后通过它的地址调用嵌套函数,那么所有的地狱都会破裂." (3认同)

Leu*_*nko 5

不是嵌套函数; 这是关闭.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中遇到严重的并发症(无限制的闭包是手工管理的噩梦).


Gan*_*har 1

在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)