如何声明函数指针参数

Dar*_*tom 5 c function-pointers implicit-conversion function-declaration

这两个声明有什么区别:

double math_operation(double x, double (*func)(double));
double math_operation(double x, double func(double));
Run Code Online (Sandbox Code Playgroud)

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

math_operation(2.0, sqrt);
Run Code Online (Sandbox Code Playgroud)

它只是语法糖还是更多?

Vla*_*cow 5

这两个函数声明

double math_operation(double x, double (*func)(double));
double math_operation(double x, double func(double));
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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 ) );
Run Code Online (Sandbox Code Playgroud)

指向函数本身的指针也可以有限定符 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 ) );
Run Code Online (Sandbox Code Playgroud)

-结束注释。]

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

8 将参数声明为“函数返回类型”应调整为“指向函数返回类型的指针”,如 6.3.2.1。