我们可以在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编码). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |