首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中的函数内部定义函数

在C++中的函数内部定义函数
EN

Stack Overflow用户
提问于 2013-10-23 03:26:33
回答 8查看 595关注 0票数 10

我想创建一个通用函数,它返回一个指向C/C++中另一个函数的函数指针。但是,第二个返回函数应该能够使用第一个函数中的变量。

例如,

代码语言:javascript
复制
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)); 
}

显然,gcc,g++是不允许我这么做的。我可以在不使用类或结构的情况下实现这一点吗?

EN

回答 8

Stack Overflow用户

发布于 2013-10-23 04:39:39

这不是关于嵌套函数;这是关于闭包。GCC的嵌套函数是闭包的一种半实现形式,它没有做问题所要求的事情。

按照任何标准,C语言根本不支持闭包。

C++11通过lambda支持闭包,还有一些其他特定于C++的解决方案。

Apple的Clang编译器以“块”的形式支持闭包作为C模式的扩展。与嵌套函数不同,这些函数实际上适用于请求的用例(即返回到更高的调用级别)。

你可以这样写出来:

代码语言:javascript
复制
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

但是,如果您想广泛使用闭包,那么您确实需要使用一种不同的语言。在C中,由于缺乏任何类型的内存管理,您将遇到严重的复杂性(无限制的闭包对于手动管理来说是一场噩梦)。

票数 5
EN

Stack Overflow用户

发布于 2013-10-23 03:27:54

回答C:

C不支持嵌套函数(在另一个函数中定义函数),但gcc允许将其作为C的GNU扩展。

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

票数 4
EN

Stack Overflow用户

发布于 2013-10-23 03:39:28

在带有lambda的C++11中,这是可能的:

代码语言:javascript
复制
#include <cstdio>
#include <cmath>
#include <functional>

typedef std::function<double(double)> func_t;

func_t inverse(func_t fn) {
    return [=](double x) { printf("fn(x): %f\n", fn(x)); return sqrt(x); };
}

double sqr(double x) { return x * x; }

int main() {
    auto inv = inverse(sqr);
    printf("sqrt %d = %f\n", 100, inv(100));
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19526590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档