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

    xiaoxiao2021-03-25  77

    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

    转载请注明原文地址: https://ju.6miu.com/read-32436.html

    最新回复(0)