繁体   English   中英

函数指针作为C ++中的参数?

[英]Function pointers as parameters in C++?

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

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 ++)接受第二种形式作为第一种形式的简写。 从技术上讲,你应该总是使用第一种形式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM