这是一个相当简单的问题,让我有点好奇。请考虑以下代码段:
#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
正在指向一个函数。
然而,它们都产生完全相同的结果,并且具有完全相同的主体,并且以完全相同的方式被调用。
我的问题是,foo
和bar
之间是否存在实际隐藏的差异?这只是C ++中的可选语法吗?这两个案例中有一个被认为是C ++中的“坏风格”吗?
如果我的编译器是一个促成因素,我正在使用Visual Studio 2010。
答案 0 :(得分:9)
没有区别:foo
和bar
的类型相同:int(int(*)())
。
没有函数类型参数这样的东西:当参数出现时带有函数类型语法(如int func(void)
)时,它会转换为相应的指针到函数类型(如{{1 }})。
转换类似于使用数组语法声明的参数(例如int (*func)(void)
)如何转换为相应的指针类型(int a[]
)。