typedef void(*Func)(void) 用法

  • Post author:
  • Post category:其他




本文希望解决以下问题:






1





typedef


的基本概念







2


、函数指针的基本概念







3





typedef void(*Func)(void)


的由来







4





typedef void(*Func)(void)


的用途






题外话:跟


typedef


有个很类似的关键字时


#define


,两者其实是有区别的,这里就不详细说,只做简单阐述





typedef


语句是在编译过程中被解析的,而


#define


是在编译之前的预处理过程中被解析的。


#define


所进行的只是对自定义别名的简单替换,而


typedef


则要灵活得多。总的来说,


typedef


可以做到


#define


所能做的所有事情,而且可以做得更好


,


但是两者是不一样的,详细区别请自行百度。





正式内容:





  • 1





    typedef—


    声明,简称


    typedef


    ,为现有类型创建一个新的名字。比如人们常常使用


    typedef


    来编写更美观和可读的代码。所谓美观,意指


    typedef


    能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。





基本用法:




typedef unsigned char UCHAR;



右边代替左边





使用


UCHAR i


语句就等同于


unsigned char i;





  • 2


    、函数指针的基本概念





说到函数指针


,


必然会提到指针函数


,


简单阐述


,


也可自行百度


.





1)


指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针







类型标识符


*


函数名


(


参数表


)



int  *f(x





y);/*


声明一个指针函数


*/



首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。





表示:





[cpp]



view plain




copy




  1. float


    *fun();





  2. float


    *p;




  3. p = fun(a);




2)


函数指针是指向函数的指针变量,他的本质是一个指针变量。





类型说明符


(*


函数名


)(


参数


)





int (*f)  (int x); /*


声明一个函数指针


*/



f=func; /*





func


函数的首地址赋给指针


f */



其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明必须和它指向函数的声明保持一致。





其主要的区别是一个是指针变量,一个是函数。





  • 3





    typedef void(*Func)(void)


    的由来





其实这样的形式声明函数指针是有





问题





的。如果仿照变量类型声明,声明函数指针似乎应该这样:


typedef void(*)()  variable;





但是


c


标准的创建者没有这样做,不知道为什么,而选择了这样的声明:




typedef void(*variable)();



C


编译器非常清楚,这就是在声明一个


void(*)()


类型的函数指针


variable









  • 4





    typedef void(*Func)(void)


    的用途






先来看下其基本用法





[cpp]



view plain




copy




  1. typedef




    void


    (*func)(


    void


    );









  2. void


    myfunc(


    void


    );







  3. func pfun = myfunc;

    /*



    赋值


    */







  4. pfun();

    /*



    调用


    */








typedef void(*Func)(void)


的用途







用法的好处:








定义一个函数指针类型










例子


:



有三个类型相似或功能相似的函数


:



[cpp]



view plain




copy





  1. void


    TASK1(


    void


    ) { printf(

    “I’m TASK1”

    ); }

    //








    函数定义








  2. void


    TASK2(


    void


    ) { printf(

    “I’m TASK2”

    ); }

    //








    函数定义








  3. void


    TASK3(


    void


    ) { printf(

    “I’m TASK3”

    ); }

    //








    函数定义






  4. … …




  5. typdef


    void


    (*func)(


    void


    );

    //







    声明







至此,我们就已经构造好了通用函数





还需要定义一个调用的函数





[cpp]



view plain




copy




  1. void


    gTASK(


    char


    i)






  2. {



  3. func vTask[3] = {&TASK1, &TASK2, &TASK3};



  4. func fun = vTask[i];



  5. (*fun)();



  6. }




使用


gTASK


来执行:





执行


gTASK(1)


会打印出


I


‘m TASK1



执行


gTASK(2)


会打印出


I


‘m TASK2



执行


gTASK(3)


会打印出


I


‘m TASK3



PS:typdef void (*func)(void);


还有很多好的用处,



操作系统



源码都用的很巧妙,有空我总结出来,再分享。





版权声明:本文为flyztek原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。