我正在阅读Alex Allain关于函数指针(http://www.cprogramming.com/tutorial/function-pointers.html)的教程,其中他描述了接收函数参数的语法:
void doSomething(int (*GetNumber)(Player p) = myFunct) {
}
然后我正在阅读Accelerated C ++,它显示了以下语法:
map<string, vector<int> >
xref(istream& in, vector<string> find_words(const string&) = split) {
}
两种方法之间有区别吗?也就是说,A与B:
A:
void doSomething(int (*GetNumber)(Player p) = myFunc) {
}
B:
void doSomething(int GetNumber(Player p) = myFunc) {
}
答案 0 :(得分:4)
没有区别,因为作为参数传递的函数被隐式转换为指针。所以这两个声明
void doSomething(int (*GetNumber)(Player p) );
void doSomething(int GetNumber(Player p) );
声明相同的功能。
您也可以将声明写为
void doSomething(int (*)(Player) );
void doSomething(int( Player ) );
与以下声明的等效性相同
void f( int a[] );
和
void f( int *a );
和
void f( int a[10] );
甚至
void f( int a[100] );
他们都声明了相同的功能。
答案 1 :(得分:2)
这里涉及两种不同的语言规则。
其中一个似乎是函数类型的参数在编译时被调整指向函数的指针:
确定每个参数的类型后,任何类型的参数 “T的数组”或“返回的函数T”被调整为“指向的指针” 分别为T“或”指向函数返回T的指针。
这是制作这些函数声明的规则:
void foo(void (*p)());
和
void foo(void (p)());
等效。
另一个是函数类型的表达式在大多数情况下隐式转换为指向函数的指针:
函数类型T的左值可以转换为类型的prvalue “指向T的指针。”结果是指向函数的指针。
给出一个函数声明:
void func();
此规则是进行所有这些调用的原因:
foo(&func);
foo(func);
foo(*func);
foo(**func);
等效。在最后一个,表达式func
是函数类型,因此它被转换为指针。内部*
取消引用指针产生函数类型的表达式,然后再次将其隐式转换为指针。外部*
做同样的事情。
实际上,表达式foo
也被转换为指针 - 这正是函数调用运算符作为(
之前的操作数所需要的。