• 函数名作为参数传递


    假如不知道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 函数。
  • 相关阅读:
    我叫mt3.0更新公告
    gcc 编译器常用的命令行参数一览
    C++两个类相互引用错误留影
    C++中的声明与定义
    C++ 杂记
    C++中两个类相互包含引用的相关问题
    Ogre 中使用OIS的两种模式
    Ogre 渲染队列(二)
    Ogre 渲染队列(一)
    Ogre 场景管理器
  • 原文地址:https://www.cnblogs.com/lialong1st/p/7756665.html
Copyright © 2020-2023  润新知