加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我们可以在C中返回一个函数吗?

发布时间:2020-12-16 09:58:38 所属栏目:百科 来源:网络整理
导读:我有一个包含三个函数的程序:main(),returnFunction()和functionToBeReturned(). main()必须调用returnFunction().我们可以使用functionToBeReturned()作为returnFunction()的返回值吗? int functionToBeReturned(){ // some code here.... return value;}
我有一个包含三个函数的程序:main(),returnFunction()和functionToBeReturned(). main()必须调用returnFunction().我们可以使用functionToBeReturned()作为returnFunction()的返回值吗?

int functionToBeReturned()
{
    // some code here....
    return value;
}

int returnFunction()
{
    // some code here....
    return functionToBeReturned();
}

int main()
{
    returnFunction();
}

这样可以吗…

解决方法

在C中,您可以拥有并返回函数指针;它们基本上指向您可以调用的机器代码.你可能有一些库函数能够“创建”函数(例如动态生成或加载一些机器代码)并给出一个指向新创建的代码的指针(dlsym,JIT库,……)
但是,在纯标准C99或C11或C 11中,无法在运行时创建原始普通函数(在机器代码级别).在限制为标准C或C的程序中,函数集是固定的(并且是除了NULL指针之外所有指针函数都可以获得的值集).由于C缺少适当的闭包,许多C框架(例如 GTK或其Glib,libevent,….)处理 callbacks,由常规混合函数指针和客户端数据实现(例如,阅读 GTK tutorial,参见 g_signal_connect,. ..)

在C(C 11或更新版本)中,您还可以拥有closures,匿名函数(即lambda-s)和std :: function;例如

std::function<int(int)> translation(int delta) {
    return [delta](int x) { return x + delta; };
 }

在返回的闭包中(语义上几乎作为一个函数,因为你可以调用并应用它),delta是一个闭合值.

关闭是一个非常重要和困难的概念,与lambda calculus和functional programming相关.不要惊讶于需要数周才能理解它.另见Scheme,Lisp In Small Pieces,SICP ….

This answer到一个非常相似的question提供了更多细节.

在机器级别,C或C函数指针通常是一些指向code segment的地址,但C闭包是一些内部对象(一些“匿名”类,编译器实现内部)混合代码指针和闭合值或引用.

学习一些函数式编程语言,如Ocaml或Scheme或Clojure或Haskell或Common Lisp,可以提高你的思维能力(即使用C或C编码).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读