gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:38:29 25 4
gpt4 key购买 nike

我有一个包含三个函数的程序: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++ 编写代码时)。

关于c++ - 我们可以在 C++ 中返回一个函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31420824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com