C——#define和typedef的用法与区别

一、#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; //指定了一个以上的存储类
也是不行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值