typedef和define

typedef和define区别:

#define 预处理指令,在预处理时进行简单而机械性的替换,不作正确性检查;

 typedef:是定义别名;typedef仅限于数据类型,而不是能是表达式或具体的值

PS:

在定义指针的时候会有很大差别;

#define PTRCHAR char*;

typedef char* DEFCHARPTR;

PTRCHAR a,b;//a为char*,b为char

DEFCHARPTR c,d;// c,d均为char*;

 

只在宏定义的文件中起作用,“宏”分为:无参数的宏和有参数的宏

define的使用

说明:

1) 宏名一般用大写,以便于与变量区别

2) 字符串可以是常数、表达式等

3) 宏定义不作语法检查,只有在编译被宏展开后的源程序才会报错

4) 宏定义不是C语言,不在行末加分号

5) 宏名有效范围为从定义到本源文件结束

6) 可以用#undef命令终止宏定义的作用域

7) 在宏定义中,可以引用已定义的宏名

define的使用坑点:

(1) 无法对宏定义中的变量进行类型检查 

此缺点,是相对于const变量来说的 

[define与const的区别的简单总结]

define定义的变量,是Compile-Time时期的变量,程序在预处理时候,就将其全部替换,而不会对其变量进行类型等属性检查,相对不是很安全,可能存在潜在的问题,而没有发现. 

正因为其仅仅是编译时期替换,所以其定义的变量,是不会在运行时候分配内存的,不占用内存空间. 

const定义的变量,是 Run-Time时期的变量,如果类型不匹配,系统在运行时候,就会发现并提示或报错,对应的,const变量在运行时期,也是一种变量,系统会为其分配内存. 

(2) 边界效应 

A. 未加括号带来的边界效应 

由于宏定义的时候,其各个分量未加括号,而在使用宏定义的时候,传递的参数是变量的表达式,然后经过系统展开后,由于优先级的原因,导致其结果不是你所希望的. 

PS:

#define MUL(A,B) A*B

而在使用的时候,这样的调用: 

int a=1,b=2,c=3,d=0; 

d=MUL(a+b,c) 

经过编译时候展开,就变成了 

d=a+b*c 

而不是我们所希望的 

d=(a+b)*c 

[解决办法] 

其解决办法也很简单,就是给每个分量,都加上括号,就可以避免此类问题 

即,在宏定义的时候,如此定义:

#define MUL(A,B) ((A)*(B))

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值