C++中#define、typedef和const的区别

来源:互联网 发布:酷家乐云设计软件下载 编辑:程序博客网 时间:2024/05/27 02:29

define

a)#define只是简单的字符串原地替换,这种替换并不是在编译阶段进行,而是在编译之前的预处理阶段就已经完成了,因此很难发现其中的错误及其它的一些问题。(与typedef对比)
b) #define可以像函数一样,接收参数
#define abs(x) x>0? x:-x (引用自C语言陷阱与缺陷)
调用时:z=abs(a-b)
答案是:a-b>0?a-b:-a-b
上述结果显然是错误的,当a-b<0时应返回-(a-b),而不是-a-b。对上述宏定义做一个简单修改,即可让程序正确运行:#define abs(x) (x)>0? (x):-(x)
一定要谨记,#define就是代码替换,不要对它有任何其它的奢求。因此,C++中提倡用const和inline来替换#define,也不无道理。
c) #define仅是简单的字符串替换,所替换的字符串并不具备一定的封装性(与typedef对比)
#define pINT int*
调用时:pINT a,b
相当于:int a,b*,表示定义了一个整形指针变量a和整型变量b
d) #define是个简单的宏定义,在使用的时候不检查数据类型。(与const对比)
e) 在大规模的开发过程中,特别是跨平台和系统的软件里,#define最重要的功能是条件编译。如#ifdef XXX…(#else) …#endif#ifndef XXX … (#else) … #endif等。
如果头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,可能出现重复定义的问题的。通过条件编译开关来避免重复包含(重复定义),如:

        #ifndef __headerfileXXX__        #define __headerfileXXX__                …                文件内容                …        #endif

typedef

a) typedef常用来标识一个标识符或关键字的别名,是程序编译过程的一部分,但实际并不分配内存空间
b) typedef并不像#define那样,不是对字符串(别名)原地扩展,这个别名有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。
typedef (int ) pINT;*
调用时:pINT a,b
相当于int *a; int *b;,表示定义了两个整形指针变量,这一点与#define有鲜明的对比。

const

C++中用const声明的变量是个固定变量,值不能修改;有数据类型;在使用的时候,会检查数据类型;可以得到这个变量的地址。
借用Lhmily博客中的一句话:const常量是编译器级别的常量,而#define常量则是真常量

0 0
原创粉丝点击