`
yangyou230
  • 浏览: 1647222 次
文章分类
社区版块
存档分类

typedef与define区别

阅读更多

(1)#define是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,不管含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。(#define是C语言中定义的语法)

例如

#define PI 3.1415926

程序中的:area=PI*r*r会被替换为3.1415926*r*r,如果把#define语句中的数字9写成了g,预处理也照样带入。

typedef是在编译时处理,所以typedef有类型检查的功能。它在自己的作用域内给一个已经存在的类型一个别名,但是不能在一个函数定义里面使用标识符typedef。(typedef是C++中定义的语法)例如:typedef int INTEGER;这以后就可用INTEGER来代替int作整型变量的类型说明了,如:

INTEGER a,b;

用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。例如:

typedef int a[10]; 表示a是整型数组类型,数组长度为10。然后就可用a说明变量,

如:a s1,s2;完全等效于: int s1[10],s2[10]

同理typedef void (*p)(void) 表示p是一种指向void型的指针类型!

(2)功能不同

typedef用来定义类型的别名,这些类型不只包含内部类型(int,char等),还包括自定义类型(如struct),可以起到使类型易于记忆的功能。

如: typedef int (*PF) (const char *, const char *);

定义一个指向函数的指针的数据类型PF,其中函数返回值为int,参数为const char *。

typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以获得最高的精度:typedef long double REAL;在不支持 long double 的机器上,该 typedef 看起来会是下面这样:typedef double REAL;并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:typedef float REAL;

#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

3、作用域不同

#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef有自己的作用域。

void fun()

{

#define A int

}

void gun()

{

//在这里也可以使用A,因为宏替换没有作用域,

//但如果上面用的是typedef,那这里就不能用A ,不过一般不在函数内使用typedef

}

4、对指针的操作

二者修饰指针类型时,作用不同。

Typedef int * pint;

#define PINT int *

Const pint p;//p不可更改,p指向的内容可以更改,相当于 int * const p;

Const PINT p;//p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;

pint s1, s2; //s1和s2都是int型指针

PINT s3, s4; //相当于int * s3,s4;只有一个是指针。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics