typedef 和#define

在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间.

作用:

typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。

一typedef的用法

使用typedef定义新的数据类型名。其一般形式为:

typedef  原有数据类型    新的数据类型

其作用是用typedef定义的新数据类型名来代替已有类型名。例如

typedef int  integer;

该定义是指定用integer 代表int类型 ,也就是为数据类型int建立了一个新名integer,这样下面两条语句是等价的:

int m,n;

integer m,n;

二、#define的用法

#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编

译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像:

#define   INT             int
#define   TRUE         1
#define   Add(a,b)     ((a)+(b));

#define   Loop_10    for (int i=0; i<10; i++)


ypedef的四个用途和两个陷阱

用途一:
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
char*   pa,   pb;     //   这多数不符合我们的意图,它只声明了一个指向字符变量的指针,  
//   和一个字符变量;
以下则可行:
typedef   char*   PCHAR;     //   一般用大写
PCHAR   pa,   pb;                 //   可行,同时声明了两个指向字符变量的指针
虽然:
char   *pa,   *pb;
也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。

用途二:
用在旧的C代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为:   struct   结构名   对象名,如:
struct   tagPOINT1
{
        int   x;
        int   y;
};
struct   tagPOINT1   p1;  

而在C++中,则可以直接写:结构名   对象名,即:
tagPOINT1   p1;

估计某人觉得经常多写一个struct太麻烦了,于是就发明了:
typedef   struct   tagPOINT
{
        int   x;
        int   y;
}POINT;

POINT   p1;   //   这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候

或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。

用途三:
用typedef来定义与平台无关的类型。
比如定义一个叫   REAL   的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef   long   double   REAL;  
在不支持   long   double   的平台二上,改为:
typedef   double   REAL;  
在连   double   都不支持的平台三上,改为:
typedef   float   REAL;  
也就是说,当跨平台时,只要改下   typedef   本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如size_t。
另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)


陷阱一:
记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如:
先定义:
typedef   char*   PSTR;
然后:
int   mystrcmp(const   PSTR,   const   PSTR);

const   PSTR实际上相当于const   char*吗?不是的,它实际上相当于char*   const。
原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char*   const。
简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。

陷阱二:
typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:
typedef   static   int   INT2;   //不可行
编译将失败,会提示“指定了一个以上的存储类”。


猜你喜欢

转载自blog.csdn.net/qq_39759656/article/details/80962391