define与typedef的区别

相信学过C语言的大部分人都知道define和typedef在功能上有很多相似的地方,但是它们有什么不同呢?现在

Mayuyu将来一一告诉你。

 

   首先define是编译预处理指令,其实它定义的变量是在编译预处理时进行简单的替换,不会作正确性检查,不

含义是否正确照样带入,只有在编译时已被展开的源程序才会发现可能的错误并报错。而typedef是在编译时处

理的,它在自己的作用域内给一个已经存在的类型一个别名。

 

这样看来define的范围其实比typedef广,对于define来说,我们可以对一个类型取别名,还可以对一个常数取

别名,还可以对一个函数取别名,等等。而对于typedef只能对一个已经存在的数据类型取别名。比如:

 

#define PI 3.1415926 ,由于Mayuyu不小心把'9'写成'g',那么在编译预处理时不会作正确性检查,照样带

入,这样就会出错了。再比如#define p int*与typedef int* p就有很大不同。

 

#define p int*

p a,b;

 

相当于int *a,b,因为我们知道int* a,b与int *a,b是一样的,这样宏替换后a是int*,而b是int。而对于

typedef来说,如下例子:

 

typdef int* p;

p a,b;

 

这样实际上相当于int *a,*b; a,b都是指针类型。可以看出define与typedef的巨大不同了吧?

 

有一句话说得好:软件的维护成本与程序员的创造力的平方成正比。接下来我们来看一段代码:

 

typedef int* Pointer1;
#define Pointer2 int*

const Pointer1 p1;
const Pointer2 p2;

 

对于p1,实际上相当于int* const p1;所以p1不可以改变,而p1所指向的内容可以改变。

对于p2,实际上相当于const int *p2或者int const *p2,因为const与int谁在前都一样,所以p2指针可

以改变,而p2指向的内容不可以改变。

 

其实define在很多时候都是不安全的,而且容易出错。比如有如下代码:

 

#include <iostream>
#include <string.h>
#include <malloc.h>
#include <stdio.h>

using namespace std;

#define F(x) x * x

int main()
{
    int ans = F(2) / F(2);
    cout<<ans<<endl;
    return 0;
}


 

或许本来你希望的答案是1,结果却得到4,因为define是直接替换,即ans = 2 * 2 / 2 * 2 = 4。要纠正,

我们只需要把#define F(x) x * x 改为 #define F(x) (x * x)即可。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值