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

Passing a function pointer with it's own parameters in 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)){
  (*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;
}

参数未传递。传递的是参数。

所以这个函数声明

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 );