如何声明函数指针参数

How to declare function pointer parameter

这两个声明有什么区别:

double math_operation(double x, double (*func)(double));
double math_operation(double x, double func(double));

它们似乎都在 GCC 中使用完全相同的调用:

math_operation(2.0, sqrt);

它只是语法糖还是还有更多?

这两个函数声明

double math_operation(double x, double (*func)(double));
double math_operation(double x, double func(double));

声明同一个函数。您可以在程序中包含这两个声明,但编译器会发出一条消息,指出存在冗余声明。

编译器将函数类型的参数隐式调整为指向函数的指针类型的参数。

另一方面,用作参数的函数指示符被转换为指向函数的指针。

[注意:通常所有这些函数声明都声明同一个函数

double math_operation( double, double (*)( double ) );
double math_operation( double, double( double ) );
double math_operation( const double, double (*)( double ) );
double math_operation( const double, double( double ) );
double math_operation( double, double (*)( const double ) );
double math_operation( double, double( const double ) );
double math_operation( const double, double (*)( const double ) );
double math_operation( const double, double( const double ) );

指向函数本身的指针也可以有限定符 const

double math_operation( double, double ( * const )( double ) );
double math_operation( const double, double ( * const )( double ) );
double math_operation( double, double ( * const )( const double ) );
double math_operation( const double, double ( * const )( const double ) );

-尾注。]

来自 C 标准(6.7.6.3 函数声明符(包括原型))

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.