ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

typedef void(*Func)(void) 用法

2022-06-20 14:05:47  阅读:114  来源: 互联网

标签:typedef func 函数 void Func 函数指针 指针


本文希望解决以下问题:

  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

float *fun();
float *p;
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

typedef void (*func)(void);
void myfunc(void);
func pfun = myfunc;/*赋值*/
pfun();/*调用*/ 

 

typedef void(*Func)(void)的用途

  用法的好处:

定义一个函数指针类型。

例子:

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

[cpp] view plain copy

void TASK1(void) { printf("I'm TASK1"); }//函数定义
void TASK2(void) { printf("I'm TASK2"); }//函数定义
void TASK3(void) { printf("I'm TASK3"); }//函数定义
... ...
typdef void (*func)(void);//声明

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

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

[cpp] view plain copy

void gTASK(char i)
{
    func vTask[3] = {&TASK1, &TASK2, &TASK3};
    func fun = vTask[i];
    (*fun)();
}

使用gTASK来执行:

执行gTASK(1)会打印出 I'm TASK1

执行gTASK(2) 会打印出I'm TASK2

执行gTASK(3) 会打印出I'm TASK3

PS:typdef void (*func)(void);还有很多好的用处,操作系统源码都用的很巧妙,有空我总结出来,再分享。

标签:typedef,func,函数,void,Func,函数指针,指针
来源: https://www.cnblogs.com/quliuliu2013/p/16392949.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有