在C中传递带有自己参数的函数指针

问题描述

#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;
}