typedef int BOOL; #define TRUE 1 #define FALSE 0定义好之后,就可以像使用基本类型数据一样使用它了,如下面的代码所示:
BOOL bflag=TRUE;
C99标准中新增了布尔类型,且定义布尔变量的方式有两种,一种是使用 _BOOL,另一种是使用 <stdbool.h> 头文件中定义好的 bool 类型,感兴趣的小伙伴请猛击这里了解详情。
typedef unsigned int COUNT;而且,我们还可以使用这种方法来定义与平台无关的类型。比如,要定义一个叫 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 _WIN64 typedef unsigned __int64 size_t; #else typedef _W64 unsigned int size_t; #endif #define _SIZE_T_DEFINED #endif
struct Point { double x; double y; double z; };在调用这个结构体时,我们必须像下面的代码这样来调用这个结构体:
struct Point oPoint1={100,100,0}; struct Point oPoint2;在这里,结构体 struct Point 为新的数据类型,在定义变量的时候均要向上面的调用方法一样有保留字 struct,而不能像 int 和 double 那样直接使用 Point 来定义变量。现在,我们利用 typedef 定义这个结构体,如下面的代码所示:
typedef struct tagPoint { double x; double y; double z; } Point;在上面的代码中,实际上完成了两个操作:
struct tagPoint { double x; double y; double z; } ;其中,struct 关键字和 tagPoint 一起构成了这个结构类型,无论是否存在 typedef 关键字,这个结构都存在。
typedef struct tagPoint Point因此,现在你就可以像 int 和 double 那样直接使用 Point 定义变量,如下面的代码所示:
Point oPoint1={100,100,0}; Point oPoint2;为了加深对 typedef 的理解,我们再来看一个结构体例子,如下面的代码所示:
typedef struct tagNode { char *pItem; pNode pNext; } *pNode;从表面上看,上面的示例代码与前面的定义方法相同,所以应该没有什么问题。但是编译器却报了一个错误,为什么呢?莫非 C 语言不允许在结构中包含指向它自己的指针?
typedef struct tagNode { char *pItem; struct tagNode *pNext; } *pNode;或者将 struct 与 typedef 分开定义,如下面的代码所示:
typedef struct tagNode *pNode; struct tagNode { char *pItem; pNode pNext; };在上面的代码中,我们同样使用 typedef 给一个还未完全声明的类型 tagNode 起了一个新别名。不过,虽然 C 语言编译器完全支持这种做法,但不推荐这样做。建议还是使用如下规范定义方法:
struct tagNode { char *pItem; struct tagNode *pNext; }; typedef struct tagNode *pNode;
typedef int INT_ARRAY_100[100]; INT_ARRAY_100 arr;
typedef char* PCHAR; PCHAR pa;对于上面这种简单的变量声明,使用 typedef 来定义一个新的别名或许会感觉意义不大,但在比较复杂的变量声明中,typedef 的优势马上就体现出来了,如下面的示例代码所示:
int *(*a[5])(int,char*);对于上面变量的声明,如果我们使用 typdef 来给它定义一个别名,这会非常有意义,如下面的代码所示:
// PFun是我们创建的一个类型别名 typedef int *(*PFun)(int,char*); // 使用定义的新类型来声明对象,等价于int*(*a[5])(int,char*); PFun a[5];
typedef char* PCHAR; int strcmp(const PCHAR,const PCHAR);在上面的代码中,“const PCHAR” 是否相当于 “const char*” 呢?
typedef const char* PCHAR; int strcmp(PCHAR, PCHAR);其实,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量。
typedef static int INT_STATIC;不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有