首页 > 代码库 > 关于函数指针

关于函数指针

   今天在看redis源码的时候发现这样的一种函数定义方法,就是将函数作为类型来定义,然后在结构体当中使用

       typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);
   typedef int aeTimeProc(struct aeEventLoop *eventLoop, long long id, void *clientData);
   typedef void aeEventFinalizerProc(struct aeEventLoop *eventLoop, void *clientData);
   typedef void aeBeforeSleepProc(struct aeEventLoop *eventLoop);

 

     typedef struct aeFileEvent {
      int mask; /* one of AE_(READABLE|WRITABLE) */
      aeFileProc *rfileProc;
      aeFileProc *wfileProc;
      void *clientData;
  } aeFileEvent;

  实际上展开之后就是如下的代码

      typedef struct aeFileEvent {
      int mask; /* one of AE_(READABLE|WRITABLE) */ 

         void  *rfileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);
    void  *wfileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);
      void *clientData;
  } aeFileEvent;

   如此定义主要是避免对同一原型函数的重复定义,这样就没必要在需要调用void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);此类原型的函数时多次定义,简化了代码,也实现的函数原型的复用。

    关于函数指针,实际上其类型是一个int类型的数值,可以在函数指针跟整形之间任意的转换

   #include <stdio.h>
  

   typedef int (*add_func_type)(int a, int b);

   struct MyStruct{
         int  m;
   };

   int add(int a, int b)
  {
        return a+b;
   }

  int main()
  {
        struct MyStruct test;
        test.m = add;
        add_func_type func = test.m;
                                                      
        printf("%d\n", func(1,2));                    
                                                      
        printf("%d\n", ((add_func_type) test.m)(1,2));
        return 0;
  }

  将函数名复制给int类型的数据,其本质就是将函数的指针复制给test.m,也就是说test.m实际上也是指向的add函数,然后将函数指针func也指向函数add,这样test.m还是func都指向add函数,只是func是 add_func_type函数指针类型,而test.m是int类型,这样需要将test.m进行强制类型转换,将其转换成函数指针类型的,实现对函数add的调用。当然在编译的过程中会出现一些警告信息,但是最终只是为了说明,函数指针和整形之间具有某种关系。

 

 

关于函数指针