相信学过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)即可。