enum 和 #define 主要区别
1.宏是在预处理阶段直接进行替换并且不进行类型检查,枚举则是在程序运行之后才起作用,宏与枚举的作用的时期不同;
2. 二者的存储位置也不同: 宏存储在代码段,宏定义会被直接插入代码段,几乎必然增加目标文件的大小,枚举常量不仅存储在数据段的静态存储区里还消耗CPU的资源。
3.枚举变量的大小只能为整型数据(例如:0、1、2…),由于enum在定义的时候不易与其它定义发生冲突(这是因为在编译的时候如果发生定义冲突就会编译报错继而终止)。此外,枚举是类型安全的,而宏定义则是类型不安全的。
4. enum当我们不主动对它进行赋值时,则枚举常量则会默认从0开始给enum中的每一个变量进行赋值,#define则不会。
5.枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个。
6.一般在编译器里,可以调试枚举常量,但是不能调试宏常量。
7.枚举量具有类型,但宏没有类型,枚举变量具有与普通变量相同的性质,如作用域,值等,但是宏没有。
8.枚举常量属于常量,但宏定义不是常量。
9.枚举常量是实体中的一种,而宏定义不是实体。
总的来说,对于大量相关的常量,个人倾向于用enum,一方面处理起来方便,一方面比较安全;单个常量可用宏定义。
inline这个关键字的引入原因和const十分相似,inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中
表达式形式的宏定义。
表达式形式的宏定义一例:
#define ExpressionName(Var1,Var2) (Var1+Var2)*(Var1-Var2)
这种表达式形式宏形式与作用跟函数类似,但它使用预编译器,没有堆栈,使用上比函数高效。但它只是预编译器上符号表的简单替换,不能进行参数有效性检测及使用C++类的成员访问控制。
inline 推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了它的缺点,同时又很好地继承了它的优点。inline代码放入预编译器符号表中,高效;它是个真正的函数,调用时有严格的参数检测;它也可作为类的成员函数。