我想了解的是什么2点声明之间的区别,f1
以及f2
,如下所示:在f1
我宣布参数是一个指针类型的函数void()
,是如何f2
从不同的声明f1
?声明是否相同?在main
我可以用样机的功能调用两者void ()
.我理解传递值/指针/引用的概念,但这些是函数,并没有真正理解它们的区别.它不像我可以"修改"作为参数传递的函数f1
...谢谢!
PS:当碰到众所周知的最令人烦恼的解析问题时,我遇到了这个问题:)
#include <iostream>
using namespace std;
void f1(void (*x)())
{
x();
}
void f2(void x())
{
x();
}
void g1()
{
cout << "Invoking f1(g1())" << endl;
}
void g2()
{
cout << "Invoking f2(g2())" << endl;
}
int main()
{
f1(g1);
f2(g2);
}
Run Code Online (Sandbox Code Playgroud)
程序编译,输出是
Invoking f1(g1())
Invoking f2(g2())
Run Code Online (Sandbox Code Playgroud)
Bri*_*ian 13
在C和C++中,如果声明函数参数具有函数类型,则其类型将调整为函数指针.
C99,§6.7.5.3/ 8
参数声明为''函数返回类型''应调整为''指向函数返回类型'的指针,如6.3.2.1所述.
C++ 11,§8.3.5/ 5
...在确定每个参数的类型之后,将"T的数组"或"返回的函数T"的任何参数分别调整为"指向T的指针"或"指向函数返回T的指针",...
因此,在C++中,我们可以编写两者的类型f1
和f2
as void(void(*)())
.
他们是等同的.你对参数发生的隐式指针转换感到困惑.
由于您不能将函数作为参数传递给函数(除了调用它们或获取其地址之外,您不能对C中的函数执行任何操作),编译器会将参数静默地更改为指向函数的指针.
这与数组发生的情况大致相同 - 您也无法将数组作为函数参数传递,因此每当您将函数参数声明为数组时,它都会以静默方式更改为指针.