函数名作为参数传递

假如不知道signal的函数原型,考虑child_handler函数的参数从哪里来?

 

void child_handler(int sig)  
{    
    if (sig == SIGINT)  
        kill(pid_parent, SIGUSR1);  
}  
  
int main(void)  
{  
    ......  
    signal(SIGINT, child_handler);  
    ......           
}  

1、无参无返回值的函数名作为另一个函数的参数

 

 

#include <stdio.h>  
  
//定义handler是一个函数指针类型,无参无返回值  
typedef void (*handler)(void);  
  
void output(void)  
{  
    printf("Hello World!\n");  
}  
  
//无参函数作为另一个函数的参数  
void test_func(handler func)  
{  
    func();  
}  
  
int main(void)  
{  
    test_func(output);  
  
    return 0;  
}  

 

运行结果:Hello World!

2、有参有返回值的函数名作为另一个函数的参数
#include <stdio.h>  
  
//定义handler是一个函数指针类型,有两个参数和返回值  
typedef int (*handler)(int, int);  
  
int add(int a, int b)  
{  
    return a+b;  
}  
  
//有参有返回值函数作为另一个函数的参数  
int test_func(int m, int n, handler func)  
{  
    return func(m, n);  
}  
  
int main(void)  
{  
    int a, b, sum;  
  
    a = 3;  
    b = 4;  
  
    sum = test_func(a, b, add);  
  
    printf("sum = %d\n", sum);  
  
    return 0;  
}  
运行结果:sum = 7

对于开始的疑惑,如果只从C语言的角度理解,原理是在执行完 signal(SIGINT, child_handler); 函数后,signal函数会将第一个参数 SIGINT 传递给 child_handler 函数。

 

posted @ 2017-10-30 15:42  LeeAaron  阅读(2797)  评论(0编辑  收藏  举报