一、#define
在C语言中#define的作用是宏定义。也就是说,可以使用一个宏名来表示一个字符串,可以包含任何字符,可以是常数、表达式等。但是,它并不在编译过程中执行,而是在预处理阶段(编译之前)就已经完成了,因此#define只是进行了简单的字符串替换,并不执行检查,所以也就难以发现一些潜在的错误或者其他的代码维护问题。
一些用法如下:
#define INT int //表示在原程序中的int就会被INT原样替换
//如:int a,b; 在编译前就会被替换成INT a,b;
#define TRUE 1
#define fAdd(a,b) ((a)+(b))
#define LOOP_10 for(int i=0;i<10;i++)
二、typedef
typedef常用来声明自定义的数据类型,即给已有的数据类型取一个“别名”。它是编译过程中的一部分,因此typedef有类型检查的功能。某些时候typedef与#define作用是一样的,如:定义了typedef int INTEGER
后,在程序中就可以使用INTEGER来代替int类型了:INTEGER a,b;
是等价于 int a,b;
可以看到typedef和#define都可以用来“取别名”。但是这两者还是有很大不同的。
三、区别
1.前面也提到,两者的执行时间不同,#define是在编译前,也就是在预处理阶段进行,不会进行检查。而typedef是在编译阶段进行,具有类型检查。
看这段简单的例子:
#define f(x) x*x
int main()
{
int a=8,b=2,c;
c=f(a)/f(b);
printf("c=%d\n",c);
return 0;
}
结果会是什么呢?是c=64,原因就是#define只是简单的替换,应该改为:#define f(x) (x*x) 加上括号,才能得到我们想要的结果。
2.作用域不同
#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef有自己的作用域。
比如:
void func1()
{ ……
#define INT int
……
}
void func2()
{
//在func2()中也可以使用INT,宏替换没有作用域
}
3.对指针的操作
#define PCTR char*
typedef char* PTR;
……
const PCTR p; //p可以更改,p指向的内容不能更改,相当于const char *p;或 char const *p。
const PTR p; //p不可更改,p指向的内容可以更改,相当于char *const p;
PTR a,b; //相当于char *a;char *b;a和b都是char型的指针
PCTR a,b; //相当于char *a;char b;只有a是char型的指针,而b是char型的变量。
除此之外,typedef句末是有”;”作为结束的,#define是没有的。
还有typedef在语法上也是一个存储类的关键字(如auto、extern、mutable、static、register等一样),即使它不真正影响存储特性,但如果:
typedef static int INT2; //指定了一个以上的存储类
也是不行的。