c++中作为参数的函数指针

Function pointers as parameters in C++?

本文关键字:函数 指针 参数 c++      更新时间:2023-10-16

我对函数指针的参数形式感到困惑。以下两个:

int fun(int (*g)())
{
    cout << g() << endl;
}
int fun(int g())
{
    cout << g() << endl;
}

这两个定义都很好。但是正如您所注意到的,这两个函数的原型有一些不同之处:

  • 第一个参数为int (*g)()
  • ,第二个取参数int g()

我的问题是它们之间有什么区别吗?

在第二种情况下,函数类型调整为指针指向函数类型,这使得两个函数相同。

int fun(int (*g)()); 
int fun(int g()); //same as above, after type adjustment

c++ 03标准在§13.1/3中说,

形参声明的不同之处在于一个是函数类型,另一个是指向同一函数类型的指针,它们是等效的即,将函数类型调整为指向函数类型(8.3.5)的指针。

[Example:
    void h(int());
    void h(int (*)());  // redeclaration of h(int())
    void h(int x()) { } // definition of h(int())
    void h(int (*x)()) { } // ill-formed: redefinition of h(int())
]

这与数组到指针的调整相同,我们更熟悉:

int fun(int *a); 
int fun(int a[]);   //same as above, after type adjustment
int fun(int a[10]); //same as above, after type adjustment

都是一样的!

你可以在这里找到我详细的答案:

  • 对函数语法的引用-带和不带&

实际上不能有函数类型的形参。一个声明为"函数返回T"类型的函数参数被调整为"指向函数返回T的指针"类型,所以你的两个定义实际上是相同的。(C有相同的规则)

类似的规则也适用于数组参数声明。例如:

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

真正的意思是:

int main(int argc, char **argv);

大多数编译器(例如MSVC, g++)接受第二种形式作为第一种形式的简写。从技术上讲,您应该始终使用第一种形式。