将函数作为参数传递的两种方式之间的区别
Difference between two ways of passing function as parameter
这两种定义接受另一个函数的函数的方法似乎工作原理相同(就像两个函数的主体相同一样(。我通过摆弄找到了第一个,然后在几个网站上找到了第二个。
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 的指针"。
相关文章:
- 在C++中将函数压缩为两种方式
- 为什么两种不同的对象初始化方式给出不同的输出
- C++:这两种将数字写入矩阵的方式之间是否存在显着的速度差异?
- 将函数作为参数传递的两种方式之间的区别
- 初始化结构的两种方式
- 在两种情况下,铸造的工作方式不同
- 这两种方式有什么区别吗?
- 由于您可以在C 中以两种方式声明复制构造函数,这是正确的方式
- 定义构造函数的两种不同方式
- 尝试在Qt中连接隐藏信号的两种方式之间做出决定
- C++:如何使用CIN和File两种方式获取输入
- 在C++中定义虚拟继承的两种不同方式
- 为什么这两种访问C++映射对部分的方式不同
- openssl sha256两种计算方式的差异
- 在C++OpenMP中使用蒙特卡罗方法以两种方式计算圆周率
- 在堆栈上声明对象的两种方式之间的差异
- 使用默认构造函数的两种方式的区别
- 声明类实例的两种方式的不同之处
- 用两种不同的方式初始化指针会得到两种结果
- 在这两种包含相同标头的方式之间,编译器中是否发生了不同的事情