问题描述
#include <stdio.h>
void runner(void (* function)(int in)){
(*function)(in);
}
void print(int in){
printf("%d\n",in);
}
int main(){
//
return 0;
}
以上代码未编译并显示此错误:'in' undeclared
。
我是否必须像这样单独传递 function pointer
的参数?
void runner(void (* function)(int),int in){
(*function)(in);
}
即从语法角度来看,有没有办法一次传递函数指针及其参数?
解决方法
不传递参数。传递的是参数。
所以这个函数声明
void runner(void (* function)(int in)){
(*function)(in);
}
只有一个参数:一个指向函数的指针,但是如果你想调用需要参数的指向函数,那么你需要提供一个参数。
在这个函数指针的声明中
void (* function)(int in)
函数参数 in
具有函数原型作用域..
你可以声明不带标识符的函数参数,如
void (* function)(int)
所以你必须用两个参数来声明函数,比如
void runner(void (* function)(int),int in ){
function(in);
}
注意取消引用函数指针是多余的。
例如所有这些调用
( *function )( int );
或
( *****function )( in );
相当于
function( in );
,
是的。
从函数类型声明类型时,参数名称将被忽略。 因此定义等价于:
void runner(void (* function)(int)){
(*function)(in);
}
和标识符 in
确实未声明。
传递带有一些参数的函数会形成一个 C 本身不支持的闭包。
或者,GCC 支持嵌套函数的扩展,可以访问嵌入函数的自动变量。
void runner(void (* function)()){
function();
}
int main(){
int in = 10;
void print(){
printf("%d\n",in);
}
runner(print);
return 0;
}