返回函数指针语法的函数

前端之家收集整理的这篇文章主要介绍了返回函数指针语法的函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在C中遇到以下语法问题:
float (*func(unsigned id))(float value) {
    ...
}

我明白那个:

>它是一个名为func的函数的定义
> func接受一个unsigned类型为id的参数
> func返回一个指向函数的指针,如下所示:float f(float value)

但我不明白为什么f(返回的函数指针)的返回值与其参数列表分开.

另外,是:func(unsigned id)一个求值为某个指针的表达式?这是(* func(unsigned id))有效的原因吗?

有人可以一步一步澄清这种语法吗?

解决方法

表达式func(id)返回一个指向函数的指针,该函数将float作为参数并返回一个float.
float(*f)(float v);  // pointer to a function 
float val;     

f = func(3);       // returns a pointer to a function 
val = (*f)(3.14);  // calls the function pointed to with argument 3.14

当然,你可以重写最后一个语句:

val = (*func(3))(3.14);  // take the ptr returned by func(3) and call the function pointed to.

如果你有这样的功能

float fct1 (float v) { return 2.0f*v+3.1f; }

你可以写:

f = fct1;       // reassign the pointer to function f to the adress of fct1

我们来看看语法. C11标准(草案N1570)在6.5.2.2中指出第1点:“表示被调用函数的表达式”应具有指向函数的类型指针“并且在第3点中:”后缀表达式后跟包含可能的括号()空的,以逗号分隔的表达式列表是一个函数调用.“

这当然涵盖了通常情况:

val = fct1 (3.14);   // fct1 is the function designator which adresses the function  
 val = (*f) (3.14);  // (*f) the dereferenced function pointer,so it addresses the function

但以下内容也符合标准:

val  = f(3.14);    //  This works as well,because f is a pointer to a function
 val = func(3)(3.14)  // works also because func(3) is a pointer to a function

然而,对于人类读者而言,第一个表达式是模棱两可的,他们可能会认为f是一个函数指示符,期望它在某个地方被定义.第二个也是不寻常的.此外,早期版本的C不承认它们. 1978年我的K& R版本要求使用形式(* f)()来调用函数指针.

最后的句法注释:如果你将f定义为float * f(float);它不会被理解为指向函数的指针,而是作为一个名为f的普通函数的前向声明并返回指向float的指针.为什么?因为C precedence rules给()一个比*更高的优先级,这意味着编译器会把它理解为(float *)(f(float)).这就是为什么需要显式括号来表明(* f)是函数指针的原因.

猜你在找的C&C++相关文章