在C语言中有一个typedef关键字,其用来定义用户自定义类型。当然,并不是真的创造了一种数据类型,而是给已有的或者符合型的以及复杂的数据类型取一个我们自己更容易理解的别名。总之,可以使用typedef关键字定义一个我们自己的类型名称。

那么,究竟如何定义,又有哪些情况下可已使用呢?接下来我们就对它的几种用法进行说明:

(1)基本数据类型定义

有些时候,我们会使用typedef关键字对一些基本数据类型进行重新定义。例如我们使用标准整数的数据类型uint8_t和uint16_t等时,其实他们的定义如下:

typedef  unsigned char   uint8_t;     //无符号8位数

typedef  signed   char   int8_t;      //有符号8位数

typedef  unsigned int    uint16_t;    //无符号16位数

typedef  signed   int    int16_t;     //有符号16位数

typedef  unsigned long   uint32_t;    //无符号32位数

typedef  signed   long   int32_t;     //有符号32位数

很显然就是使用了typedef关键字给既有数据类型分配了一个别名。当我们使用uint8_t时,就和使用unsigned char是一样的。如我们声明uint8_t var时,和使用unsigned char var是一回事。

(2)指针数据类型定义

有些时候我们也会使用typedef关键字定义指针数据类型,用以简化我们所使用的指针变量的声明。

例如:typedef int *pointer;

这样我们就定义了一个指针类型,当我们使用pointer p声明一个指针变量,就和使用int *p的含义是一样的。

上面是一个指针变量类型,可以演化出很多用法,如定义数组对象可以更明确。有时候,我们也定义指向二位数组行的指针,使用typedef关键字就可以使得操作更符合我们的常规认知。

例如: typedef int (*pointer)[N];

这里pointer等价于 int (*)[N],当我们声明pointer p就相当于声明int (*a)[N]。同样的,如果我们对二维数组采用类似的定义。

例如:typedef int array[M][N];

那它的含义与指针是类似的,如我们定义array a就是声明了一个M行N列的数组,此时使用p=a是可以的。

我们考虑到数组很多时候可以使用指针表示,所以将其放在一起讨论,而其它一些对象指针我们单独讨论。其实,不光是上述数组和指针可以使用typedef关键字定义别名,其它如:一维和多位数组,指针数组等都可以这样使用。

(3)用户对象类型定义

首先说明,这里说所的用户对象是指结构体、联合体以及枚举等用户定义的数据类型。我们可以使用typedef关键字给结构体等类型定义一个别名,这样我们客气在多个地方更方便的使用它。当然很多人对此有不同看法,这里不讨论,我们只是说有这种用法。

使用typedef关键字为结构体类型定义一个别名。

例如:typedef struct{

float setpoint;               /*设定值*/

float kp;                     /*比例系数*/

float ki;                     /*积分系数*/

float kd;                     /*微分系数*/

float lasterror;              /*前一拍偏差*/

float preerror;               /*前两拍偏差*/

float deadband;               /*死区*/

float result;                 /*PID控制器计算结果*/

float output;                 /*输出值0-100%*/

float maximum;                /*输出值上限*/

float minimum;                /*输出值下限*/

float errorabsmax;            /*偏差绝对值最大值*/

float errorabsmin;            /*偏差绝对值最小值*/

float alpha;                  /*不完全微分系数*/

float deltadiff;              /*微分增量*/

float integralValue;          /*积分累计量*/

float gama;                   /*微分先行滤波系数*/

float lastPv;                 /*上一拍的过程测量值*/

float lastDeltaPv;            /*上一拍的过程测量值增量*/

}CLASSICPID;

这样我们在需要使用结构体类型定义一个对象时,我们可以使用CLASSICPID vPID就可以了与使用原始定义是一样的。

同样我们也可以使用typedef关键字为枚举类型定义一个别名。

例如:typedef enum {

FC_REG_Write=((uint8_t)0x80),         /*写寄存器的功能码*/

FC_REG_Read=((uint8_t)0x81),          /*读寄存器的功能码*/

FC_VAR_Write=((uint8_t)0x82),         /*写变量的功能码*/

FC_VAR_Read=((uint8_t)0x83),          /*读变量的功能码*/

FC_Curve_Write=((uint8_t)0x84)        /*写曲线缓冲区的功能码*/

}DwinFunctionCode;

我们需要定义枚举变量时,也是使用DwinFunctionCode fc就可以了。当然,我们也可已使用定义的类型声明指针变量,或者直接使用typedef关键字定义指向对象的指针类型,如定义结构体指针类型。

(4)函数类型定义

typedef关键字也常用来定义函数类型,用以声明同类型的函数或者函数指针变量。这一种类型定义在函数用作形参等一回调的方式使用时,非常有用,具体用法可参考回调函数的使用。

使用typedef关键字定义函数类型与前面的各种定义方式类式。

例如: typedef int fType(void);

在这里fType等价于 int (void)类型函数。如果我们使用fType function声明函数function时,与使用int function (void)来声明是一样的。

同样我们也可以使用fType来定义函数指针。如果我们使用fType *fPointer声明函数指针fPointer时,和使用int (*fPointer) (void)来声明是一样的。

当然,我们也可以使用typedef关键字直接定义函数指针类型。

例如: typedef  int (*fPointer)(void);

这样我们就可以使用fPointer来定义一个函数指针。如我们使用fPointer fp声明函数指针就如同使用int (*fp)(void)来声明。

(5)typedef关键字与宏定义

我们已经说明了typedef关键字的基本用法。但我们发现它的功能视乎宏定义也能实现,所以我们接下来说明一下typedef关键字和#define定义的宏之间究竟有何不同。

从功能范围上讲是有区别的,typedef主要是为已存在的关键字或类型及其组合取一个我们容易识别的别名。在这一点上#define也可实现,但初次之外#define还有很多其它用处,如果愿意你可以使用它定义任何代码,这时typedef所不具备的。

执行时间也是有区别的,对于#define定义的宏,其在预处理阶段就会被替换。而typedef定义的类型会在编译时处理。

从作用于上来讲也是有区别的,一般来说#define定义的宏没有作用于的限制,只要在使用前有定义就可以了。而typedef定义的别名是有作用于的。

从实现效果来讲也是有区别的,我们使用typedef定义一个指针类型,然后使用该类型可以同时声明对各变量,而#define却不是这样的。如typedef (int*) pType;可以使用pType a,b;这里a和b都是指向整数的指针变量。但我们同样定义#define pType int*,若使用pType a,b;定义a和b,则a是指向整数的指针变量,而b不是。

欢迎关注:

C语言学习及应用笔记之五:C语言typedef关键字及其使用相关推荐

  1. C++语言学习(十二)——C++语言常见函数调用约定

    C++语言学习(十二)--C++语言常见函数调用约定 一.C++语言函数调用约定简介 C /C++开发中,程序编译没有问题,但链接的时候报告函数不存在,或程序编译和链接都没有错误,但只要调用库中的函数 ...

  2. Python语言学习之图表可视化:python语言中可视化工具包的简介、安装、使用方法、经典案例之详细攻略

    Python语言学习之图表可视化:python语言中可视化工具包的简介.安装.使用方法.经典案例之详细攻略 目录 python语言中可视化工具包的简介 python语言中可视化工具包的安装 pytho ...

  3. C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符

    C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 目录 C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 英文字符 字符的表示 ...

  4. C语言学习及应用笔记之一:C运算符优先级及使用问题

    C语言中的运算符绝对是C语言学习和使用的一个难点,因为在2011版的标准中,C语言的运算符的数量超过40个,甚至比关键字的数量还要多.这些运算符有单目运算符.双目运算符以及三目运算符,又涉及到左结合和 ...

  5. c语言字 字符串转换成数组_C语言学习教程之详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include 总结 以上 ...

  6. go语言学习路线图_开篇:Go 语言的优势与学习路线图

    开篇:Go 语言的优势与学习路线图 由 学院君 创建于1年前, 最后更新于 4个月前 版本号 #5 简介 Go 语言又称 Golang,由 Google 公司于 2009 年发布,近几年伴随着云计算. ...

  7. C语言学习教程之详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include <s ...

  8. go语言学习路线图_2019年最新Go语言学习路线图,三个月带你通关Go语言

    作者:郝林 内容选自:<Go语言核心36讲> 1. 明星大厂热推,岗位需求火热. 最近,Hacker News 发布了 2018 年编程语言的招聘趋势排行榜,其中,Go语言已经反超Java ...

  9. 两个变量实现查找坏环c语言,C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...

    程序员无言 2020-07-07 一.C语言程序的构成 与C++.Java相比,C语言其实很简单,但却非常重要.因为它是C++.Java的基础.不把C语言基础打扎实,很难成为程序员高手. 1.C语言的 ...

最新文章

  1. java数列求和_java中关于数列求和的计算方法
  2. Jenkins设置svn授权
  3. Django报错:mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is required, you have 0.9.3的解决办法
  4. UDP千兆以太网FPGA_verilog实现(三、代码前期准备-时序要求)
  5. 如何提高自己的工作效率
  6. orderby排序慢_使用@OrderBy对Spring Data MongoDB集合进行排序
  7. Jquery学习总结(7)——JQuery常用的10个方法总结
  8. 上海新中考体育考试方案公布:总分30分不变
  9. 人人能上手:OpenAI发射初学者友好的强化学习教程 | 代码简约易懂
  10. C++ 中两个数据交换总结
  11. 从0到1开发H5游戏
  12. 可调稳压电源lm317实验报告_LM317可调稳压电源实训实验.doc
  13. Freemarker函数
  14. oracle查看表空间的属性 ,修改表空间的状态
  15. Win7 共享打印机脱机解决
  16. 万字文肝Java基础知识(一)
  17. 【已解决】Unknown error 1146
  18. 关于css设置第n个元素
  19. indesign怎么查找拼音_用Indesign CS 巧排拼音的方法
  20. 区块链学习(8) EOS环境安装和智能合约部署实战(绝对干货!)

热门文章

  1. 【机器学习】逻辑回归模型
  2. day34 数据库入门
  3. ansible配置zabbix自动化安装和配置
  4. STM32F105 PA9/OTG_FS_VBUS Issues
  5. 2015年2月12日——不懂点
  6. linux 学习操作小计
  7. Debian卸载iceweasel
  8. 为脚本语言平反-JavaScript篇(3)
  9. linux服务器配置与管理_服务器维护实施步骤
  10. pythonfor循环列表排序_Python使用for循环对列表内元素进行排序方法