尽量使用const、enum、inline代替#define

来源:互联网 发布:金山数据恢复收费吗 编辑:程序博客网 时间:2024/06/05 20:55

1、 # define A 1.6

宁可使用编译器也不使用预处理,原因:
当使用预处理时,记号名称A也许从未被编译器看见(因为预处理是在编译阶段进行替换),所以一旦出现编译错误,(如果A被定义在一个非你写的头文件内),你肯定对1.6以及它的来源毫不知情,这样就会因为追踪它而浪费时间。
因此—>用const替换不会发生这种情况(找编译错误难找的情况)。
# define不能进行安全性类型检查

【 知识点1】
在头文件内定义一个常量不变的字符串有两种方式:
const char* const str = “String”;
const string str(String); //一般选这种形式
【 知识点2】static const
用作类内部static const的初始化问题:
①只有static const int类型的常量才能在类内进行声明和初始化;
②非static const int类型,使用:类内声明,类外初始化形式。
2、enum的引出原因
如果你的编译器不允许使用“const static int class常量”完成类内初始化设定,而且编译器坚持必须在编译器期间知道数组的大小,可改用enum。
理论基础:一个属于枚举类型的数值可全充ints被使用。
“`
class A
{
enum { size = 5 };//令Numturns成为 5 的一个记号名称
int array[size]; //这样就没有问题了
}
/*说明:enum的行为某方面说比较像#define而不像const,有时候这正是你想要的。例如:取一个const的地址是合法的,取一个enum的地址是不合法的,而取一个#define的地址通常是不合法的。
【因此】—>如果你不想让别人的指针或者引用指向你的某个整数常量,enum可以帮助你实现这个约束。此外,enum和#define绝对不会导致非必要的内存分配*/

3、inline函数的引出
# define CALL_BACK(a,b) f((a)>(b)?(a):(b))
无论何时都要记住:必须为宏中的所有实参加上小括号;
但是即便这样做,有时候错误也难以避免。

【总结】
对于单纯常量,最好用const、enum替换#define
对于形似函数的宏,最好用inline函数替换#define

1 0
原创粉丝点击