现在的位置: 首页 > 综合 > 正文

typedef和define的详细区别

2014年01月30日 ⁄ 综合 ⁄ 共 1671字 ⁄ 字号 评论关闭

转载请注明出处http://blog.csdn.net/21aspnet/article/details/6723915

1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如: 

#define PI 3.1415926 

程序中的:area=PI*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 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所指的对象。 


4)也许您已经注意到#define 不是语句 不要在行末加分号,否则 会连分号一块置换。


//-------------------------------------------------------------------------------

//-------------------------------------------------------------------------------

测试代码如下:(测试环境vc6.0)

 #include <stdio.h>
 
 //此处,是使用宏定义定义了一个函数f,有两个参数x,y。则在“函数体”中x,y必须都要用括号括起来
 #define f(x,y) (2*(x)-(y))
 
 #define PINT int*
 
 typedef int* pint;	//注意要以分号结尾
 
 
 int main()
 {
 	int i;
 	i=f(2+1,1+1);
 	printf("%d\n",i);
 
 
 	int a=1,b=2,c=3,d=4;
 	PINT p1,p2;	//此句相当于 int *p1,p2;  所以p2为int类型,而非int *类型
 	pint p3,p4;
 	p1=&a;
 	p2=b;	//若为 p2=&b; 会报错
 	p3=&c;
 	p4=&d;
 	printf("%d,%d,%d,%d\n",*p1,p2,*p3,*p4);
 
 
 	int x=5,y=6;
 	//p5可更改,但是p5指向的内容不可更改,p6不可更改,但p6指向的内容可更改。 
 	const PINT p5=NULL;
 	const pint p6=&y;	//不初始化就会报错:"error C2734: 'p6' : const object must be initialized if not extern"
 	p5=&x;
 	*p6=8;
 	//*p5=8;	//p5指向的内容不可更改,此处报错
 	//p6=&x;	//此句亦因为p6为const类型指针变量,除了初始化之外,不能为const类型变量赋值(p6不可更改)
 	printf("%d,%d\n",*p5,*p6);
 
 
 	return 0;
 }
 

运行结果:

【上篇】
【下篇】

抱歉!评论已关闭.