gpt4 book ai didi

将函数作为参数传递给函数的 C 方法

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

我注意到似乎有不同的方法可以将一个函数作为参数传递给另一个函数。原型(prototype)是:

void foo1(double f(double));

void foo2(double (*f)(double));

两者有区别吗?它们的实现方式相同吗?还有其他方法可以传递函数吗?

最佳答案

第二种可以说是“正确”的编写方式。它表示 foo1() 的参数是一个指向函数的指针。第一个说参数是一个函数,但您不能将函数本身作为函数传递,因此编译器将其视为指向函数的指针。因此,实际上,在这种情况下,它们是等价的。但是,在其他情况下,您将无法使用 double f(double); 符号来声明指向函数的指针。

ISO/IEC 9899:2011 §6.7.6.3 Function declarators (including prototypes)

¶8 A declaration of a parameter as "function returning type" shall be adjusted to "pointer to function returning type", as in 6.3.2.1.

附属问答

Could you please give an example where double f(double); wouldn't work?

#include <math.h>

double (*pointer)(double) = sin;
double function(double); // This declares the existence of 'function()'

这是在文件范围内;它也可以在代码块中,例如在函数内部。指向函数符号的指针按您的预期工作。普通函数只是声明一个函数,而不是包含函数指针的变量。

符号唯一(松散)等价的地方是在函数参数列表中:

声明:

double integrate(double lo, double hi, double (*function)(double));
double differentiate(double lo, double hi, double function(double));

定义:

double integrate(double lo, double hi, double (*function)(double))
{
...
}

double differentiate(double lo, double hi, double function(double))
{
...
}

函数或函数指针参数可以在这些声明和定义中互换使用,但只能在参数列表中使用——不能在函数体中使用。

因为显式“指向函数的指针”表示法在任何地方都有效,而其他表示法仅在非常有限的地方有效,所以您通常应该使用显式“指向函数的指针”表示法,即使它有点冗长。

关于将函数作为参数传递给函数的 C 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18669853/

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