将函数作为参数传递的两种方式之间的区别

Difference between two ways of passing function as parameter

本文关键字:两种 方式 之间 区别 参数传递 函数      更新时间:2023-10-16

这两种定义接受另一个函数的函数的方法似乎工作原理相同(就像两个函数的主体相同一样(。我通过摆弄找到了第一个,然后在几个网站上找到了第二个。

void foo(int bar())
void foo(int (*bar)())

示例正文:

{
for (int i = 0; i < 10; i++)
cout << bar() << ' ';
}

有什么区别?一个比另一个更受欢迎吗?它是编译器还是C++版本相关?

根据函数参数声明规则,它们是相同的。

参数列表中每个函数参数的类型根据以下规则确定:
...
3(如果类型是函数类型F,则替换为类型"指向F的指针">
...

对我来说,更可取的方法是

void foo( int bar( void ) );

因为作为参数的函数声明看起来更清晰。

这类似于写

void f( int a[] );

void f( int * );

第一个声明为代码的读者提供了函数接受数组而不是指向单个对象的指针的想法。

例如

int main( int argc, char * argv[] )

看起来更清晰

int main( int argc, char ** argv )

实际上没有区别,因为编译器将函数类型的参数隐式调整为指向函数类型的指针。

从C++ 17 标准(11.3.5 功能(

5 函数的类型使用以下规则确定。这 每个参数(包括函数参数包(的类型为 由其自己的 decl-specifier-seq 和声明符确定。后 确定每个参数的类型,任何类型为"数组"的参数 的 T"或函数类型 T 被调整为"指向 T 的指针"。