博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
typedef的用法
阅读量:4091 次
发布时间:2019-05-25

本文共 2869 字,大约阅读时间需要 9 分钟。

始终记住typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换

一、四个作用

  1. 为基本数据类型定义新的类型名
    typedef unsigned char                                       UINT8;typedef unsigned short                                      UINT16;typedef unsigned int                                        UINT32;typedef signed char                                         INT8;typedef signed short                                        INT16;typedef signed int                                          INT32;typedef float                                               FLOAT;typedef double                                              DOUBLE;typedef char                                                CHAR;
  2. 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称

    以结构体为例,下面我们定义一个名为 student的结构体:

    typedef struct student{
    //code}Stu_st,*Stu_pst;/*struct student stu1;和 Stu_st stu1;没有区别。struct student *stu2;和 Stu_pst stu2;和 Stu_st *stu2;没有区别。*/
  3. 用typedef来定义与平台无关的类型

    我们还可以使用这种方法来定义与平台无关的类型。比如,要定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型,即:

    typedef long double REAL;

    在不支持 long double 的平台二上,改为:

    typedef double REAL;

    甚至还可以在连 double 都不支持的平台三上,改为:

    typedef float REAL;

    这样,当跨平台移植程序时,我们只需要修改一下 typedef 的定义即可,而不用对其他源代码做任何修改。其实,标准库中广泛地使用了这个技巧,比如 size_t 在 VC++2010 的 crtdefs.h 文件中的定义如下所示:

    #ifndef _SIZE_T_DEFINED#ifdef  _WIN64typedef unsigned __int64    size_t;#elsetypedef _W64 unsigned int   size_t;#endif#define _SIZE_T_DEFINED#endif
  4. 为复杂的声明定义一个新的简单的别名

    为指针定义简洁的名称

    typedef char* PCHAR;PCHAR pa;

    为函数指针定义简洁的名称

    #include 
    int add(int a, int b) {
    return a + b; } typedef int (PTypeFun1)(int, int); // 声明一个函数类型 typedef int (*PTypeFun2)(int, int); // 声明一个函数指针类型 int (*padd)(int, int); // 传统形式,定义一个函数指针变量 int main() {
    PTypeFun1 *pTypeAdd1 = add; PTypeFun2 pTypeAdd2 = add; padd = add; printf("pTypeAdd1(1, 2) is %d \n", pTypeAdd1(1, 2)); printf("pTypeAdd2(1, 2) is %d \n", pTypeAdd2(1, 2)); printf(" padd(1, 2) is %d \n", padd(1, 2)); return 0; }

    为复杂的变量声明定义简洁的名称

    // PFun是我们创建的一个类型别名typedef int *(*PFun)(int,char*);// 使用定义的新类型来声明对象,等价于int*(*a[5])(int,char*);PFun a[5];//a[5]为指向函数的指针数组,数组名为a,数组内存了5个指向函数的指针,这些函数有一个int型的参数和一个char*型的参数,函数的返回值也是一个指针

二、两个陷进

  1. 和const结合的陷进

    记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如:

    先定义:

    typedef char* PSTR;

    然后:

    int mystrcmp(const PSTR, const PSTR);

    const PSTR” 是否相当于 “const char*” 呢?

    答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换
    const PSTR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char* const(一个指向char的常量指针)”。即它实际上相当于“char* const”,而不是“const char*(指向常量 char 的指针)”要想让 const PSTR相当于 const char* 也很容易,如下面的代码所示:

    typedef const char* PCHAR;int mystrcmp(PCHAR, PCHAR);
  2. 和数据类型结合的陷进

    typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:

    typedef static int INT2; //不可行//编译将失败,会提示“指定了一个以上的存储类”

三、和#define的区别

在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种数据类型,但是我们使用define就不能保证了

#define PCHAR char*PCHAR p3,p4;//这里的 p4 不是指针,仅仅是一个 char 类型的字符
typedef char* pchar;pchar p1,p2;//这里的 p1,p2 都是指针

转载地址:http://ydnii.baihongyu.com/

你可能感兴趣的文章
2017年,这一次我们不聊技术
查看>>
实现接口创建线程
查看>>
Java对象序列化与反序列化(1)
查看>>
HTML5的表单验证实例
查看>>
JavaScript入门笔记:全选功能的实现
查看>>
程序设计方法概述:从面相对象到面向功能到面向对象
查看>>
数据库事务
查看>>
JavaScript基础1:JavaScript 错误 - Throw、Try 和 Catch
查看>>
SQL基础总结——20150730
查看>>
SQL join
查看>>
JavaScript实现页面无刷新让时间走动
查看>>
CSS实例:Tab选项卡效果
查看>>
前端设计之特效表单
查看>>
前端设计之CSS布局:上中下三栏自适应高度CSS布局
查看>>
Java的时间操作玩法实例若干
查看>>
JavaScript:时间日期格式验证大全
查看>>
pinyin4j:拼音与汉字的转换实例
查看>>
XML工具代码:SAX从String字符串XML内获取指定节点或属性的值
查看>>
时间日期:获取两个日期相差几天
查看>>
责任链模式 Chain of Responsibility
查看>>