我试图理解函数指针是如何工作的。这代表设置:
bool f1(int x){
if(condition){return true;}
else return false;
}
bool f2(int x, bool (*func)(int)){
if (func(x)){return true;}
else return false;
}
void f3(int x, bool (*func)(int, bool)){
if (func(x, f1)) {return "Whatever";}
else return "Nevermind";
int main(){
f3(x, f2);
}
这给了我:
在功能' void f3()':
"警告:布尔的地址' f1(int)'将始终评估为' true' [-Waddress]
在功能' int main()':
错误:来自' bool()的无效转换(int,bool()(int))' to' bool(*)(int,bool)'
我搞砸了多少?
答案 0 :(得分:1)
如果直接从函数的地址生成函数指针,函数指针将始终为非null,并且只有空指针将计算为false
。
func
的第二个参数需要是bool
,但您传递的是函数的名称。该函数自动转换为指向函数的指针,然后使用上述规则自动转换为bool
。
答案 1 :(得分:1)
void f3(int x, bool (*func)(int, bool)){ ^^^^
f3
的第二个参数是指向第二个参数为bool
的函数的指针。
f2
是您要传递给f3
的函数类型,并且来自f3
,但f2
的第二个参数的类型为bool (*)(int)
因此应该声明f3
:
void f3(int x, bool (*func)(int, bool (*)(int)))
注意:通过恰当地使用typedef
可以使这更具可读性:
typedef bool f1_t(int);
typedef bool f2_t(int, f1_t*);
bool f1(int x) { ... }
bool f2(int x, f1_t* func) { ... }
void f3(int x, f2_t* func) { ... }