功能和功能指针之间的区别作为参数

时间:2011-10-21 02:33:47

标签: c++ function-pointers

这是一个相当简单的问题,让我有点好奇。请考虑以下代码段:

#include <iostream>

int three()
{
    return 3;
}

void foo(int func(void))
{
    std::cout << func() << std::endl;
}

void bar(int (*func)(void))
{
    std::cout << func() << std::endl;
}

int main()
{
    foo(three);
    bar(three);
    return 0;
}

// output:
// 3
// 3

正如您所看到的,我们有两个函数将另一个函数作为唯一的参数。但是,它们的功能原型不同。主要是,我们有void foo(int func(void))void bar(int (*func)(void))。乍一看,看起来foo正在接受函数本身,bar正在指向一个函数。

然而,它们都产生完全相同的结果,并且具有完全相同的主体,并且以完全相同的方式被调用。

我的问题是,foobar之间是否存在实际隐藏的差异?这只是C ++中的可选语法吗?这两个案例中有一个被认为是C ++中的“坏风格”吗?

如果我的编译器是一个促成因素,我正在使用Visual Studio 2010。

1 个答案:

答案 0 :(得分:9)

没有区别:foobar的类型相同:int(int(*)())

没有函数类型参数这样的东西:当参数出现时带有函数类型语法(如int func(void))时,它会转换为相应的指针到函数类型(如{{1 }})。

转换类似于使用数组语法声明的参数(例如int (*func)(void))如何转换为相应的指针类型(int a[])。