C _TYPEDEF用法详解

  • 格式:pdf
  • 大小:158.24 KB
  • 文档页数:11
2. 原声明:void (*b[10]) (void (*)()); 变量名为 b,先替换右边部分括号里的,pFunParam 为别名一: typedef void (*pFunParam)(); 再替换左边的变量 b,pFunx 为别名二: typedef void (*pFunx)(pFunParam); 原声明的最简化版: pFunx b[10];
typedef 的主要应用形式
typedef 的主要应用有如下的几种形式: 1) 为基本数据类型定义新的类型名。 2) 为自定义数据类型(结构体、公用体和枚举类型)定义简洁的类型名称。 3) 为数组定义简洁的类型名称。 4) 为指针定义简洁的名称。 ,为基本数据类型定义新的类型名.txt,自定义数据类型定义简洁的类型名称.txt,为数组定义简洁的类型名 称.txt,为指针定义简洁的名称.txt 为基本数据类型定义新的类型名 TAG:结构体,类型重定义 typedef,typedef 的主要应用形式 typedef unsigned int COUNT; typedef double AREA; 此种应用的主要目的,首先是丰富数据类型中包含的属性信息,其次是为了系统移植的需要,稍后详细描 述。
typedef int* int_ptr; int_ptr a, b; //a, b 都为指向 int 的指针,typedef 为 int* 引入了一个新的助记符 这也说明了为什么下面观点成立 //QunKangLi(维护成本与程序员的创造力的平方成正比) typedef int * pint ; #define PINT int * 那么: const pint p ;//p 不可更改,但 p 指向的内容可更改 const PINT p ;//p 可更改,但是 p 指向的内容不可更改。 pint 是一种指针类型 const pint p 就是把指针给锁住了 p 不可更改 而 const PINT p 是 const int * p 锁的是指针 p 所指的对象。 3)也许您已经注意到#define 不是语句 不要在行末加分号,否则 会连分号一块置换。
typedef long double REAL; 在不支持 long double 的平台二上,改为: typedef double REAL; 在连 double 都不支持的平台三上,改为: typedef float REAL; 也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。 标准库就广泛使用了这个技巧,比如 size_t。 另外,因为 typedef 是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用 宏有时也可以完成以上的用途)。
3. 原声明:doube(*)() (*e)[9]; 变量名为 e,先替换左边部分,pFuny 为别名一: typedef double(*pFuny)(); 再替换右边的变量 e,pFunParamy 为别名二 typedef pFuny (*pFunParamy)[9]; 原声明的最简化版: pFunParamy e;
typedef 的四个用途和两个陷阱
用途一:
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,
// 和一个字符变量;
以下则可行:
typedef char* PCHAR; // 一般用大写
其中结构体 struct Point 为新的数据类型,在定义变量的时候均要有保留字 struct,而不能像 int 和 double 那样直接使用 Point 来定义变量。如果经过如下的修改, typedef struct tagPoint { double x; double y; double z; } Point; 定义变量的方法可以简化为 Point oPoint; 由于定义结构体类型有多种形式,因此可以修改如下: typedef struct { double x; double y; double z; } Point;
PCHAR pa, pb;
// 可行,同时声明了两个指向字符变量的指针
虽然:
char *pa, *pb;
也可行,但相对来说没有用 typedef 的形式直观,尤其在需要大量指针的地方,typedef 的方式更省事。
用途二:
用在旧的 C 代码中(具体多旧没有查),帮助 struct。以前的代码中,声明 struct 新对象时,必须要带上 struct,即形式为: struct 结构名 对象名,如: struct tagPOINT1 {
MyFUN *pMyFun; pMyFun= Max;
使用 typedef 注意的问题
在使用 typedef 时,应当注意如下的问题: 1) typedef 的目的是为已知数据类型增加一个新的名称。因此并没有引入新的数据类型。 2) typedef 只适于类型名称定义,不适合变量的定义。 3) typedef 与#define 具有相似的之处,但是实质不同。 提示 #define AREA double 与 typedef double AREA 可以达到相同的效果。但是其实质不同, #define 为预编译处理命令,主要定义常量,此常量可以为任何的字符及其组合,在编译之前,将此常量 出现的所有位置,用其代表的字符或字符组合无条件的替换,然后进行编译。typedef 是为已知数据类型 增加一个新名称,其原理与使用 int double 等保留字一致。
POINT p1; // 这样就比原来的方式少写了一个 struct,比较省事,尤其在大量使用的时候
或许,在 C++中,typedef 的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的, 毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。
用途三:
用 typedef 来定义与平台无关的类型。 比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef 和 define 具体的详细区别
1) #define 是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带 入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如: #dPI*r*r 会替换为 3.1415926*r*r 如果你把#define 语句中的数字 9 写成字母 g 预处理也照样带入。 2)typedef 是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,但是 You cannot use the typedef specifier inside a function definition。 3)typedef int * int_ptr 与 #define int_ptr int * 作用都是用 int_ptr 代表 int * ,但是二者不同,正如前 面所说 ,#define 在预处理 时进行简单的替换,而 typedef 不是简单替换 ,而是采用如同定义变量的方 法那样来声明一种类型。也就是说; //refer to (xzgyb(老达摩)) #define int_ptr int * int_ptr a, b; //相当于 int * a, b; 只是简单的宏替换
typedef 的语法描述
在现实生活中,信息的概念可能是长度,数量和面积等。在 C 语言中,信息被抽象为 int、float 和 double 等基本数据类型。从基本数据类型名称上,不能够看出其所代表的物理属性,并且 int、float 和 double 为系统关键字,不可以修改。为 了解决用户自定义数据类型名称的需求,C 语言中引入类型重定义语句 typedef,可以为数据类型定义新的类型名称,从而丰富数据类型所包含的属性信息。 typedef 的语法描述 typedef 类型名称 类型标识符; typedef 为系统保留字,“类型名称”为已知数据类型名称,包括基本数据类型和用户自定义数据类型, “类型标识符”为新的类型名称。例如: typedef double LENGTH; typedef unsigned int COUNT; 定义新的类型名称之后,可像基本数据类型那样定义变量。例如: typedef unsigned int COUNT; unsigned int b; COUNT c;
int x; int y; }; struct tagPOINT1 p1;
而在 C++中,则可以直接写:结构名 对象名,即: tagPOINT1 p1;
估计某人觉得经常多写一个 struct 太麻烦了,于是就发明了: typedef struct tagPOINT {
int x; int y; }POINT;
为数组定义简洁的类型名称 TAG:结构体,类型重定义 typedef,typedef 的主要应用形式 为数组定义简洁的类型名称。例如,定义三个长度为 5 的整型数组, int a[10],b[10],c[10],d[10]; 在 C 语言中,可以将长度为 10 的整型数组看作为一个新的数据类型,再利用 typedef 为其重定义一个新 的名称,可以更加简洁形式定义此种类型的变量,具体的处理方式如下: typedef int INT_ARRAY_10[10]; typedef int INT_ARRAY_20[20]; INT_ARRAY_10 a,b,c,d; INT_ARRAY_20 e; 其中 INT_ARRAY_10 和 INT_ARRAY_20 为新的类型名,10 和 20 为数组的长度。a,b,c,d 均是长度 为 10 的整型数组,e 是长度为 20 的整型数组。
自定义数据类型定义简洁的类型名称 TAG:结构体,类型重定义 typedef,typedef 的主要应用形式 为自定义数据类型(结构体、公用体和枚举类型)定义简洁的类型名称。例如: struct Point { double x; double y; double z; }; struct Point oPoint1={100,100,0}; struct Point oPoint2;