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))