zoukankan      html  css  js  c++  java
  • 函数名作为参数传递

    假如不知道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!
    ");  
    }  
      
    //无参函数作为另一个函数的参数  
    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
    ", sum);  
      
        return 0;  
    }  
    运行结果:sum = 7

    对于开始的疑惑,如果只从C语言的角度理解,原理是在执行完 signal(SIGINT, child_handler); 函数后,signal函数会将第一个参数 SIGINT 传递给 child_handler 函数。
  • 相关阅读:
    latch与DFF
    数字逻辑综合DC脚本示例及解释
    当DiscuzNT遇上了Loadrunner(下)
    [C#学习]在多线程中如何调用Winform
    并发性测试工具
    当DiscuzNT遇上了Loadrunner(上)
    大型网站(高访问、海量数据)技术架构
    Load Runner下载
    Invoke 和 BeginInvoke 的真正涵义
    当DiscuzNT遇上了Loadrunner(中)
  • 原文地址:https://www.cnblogs.com/lialong1st/p/7756665.html
Copyright © 2011-2022 走看看