Effective c++条款2:尽量用const,enum,inline替换#define
作者:互联网
#define ASPECT_RATIO 1.653
-
ASPECT_RATIO可能从未被编译器看见;也可能在编译器开始处理源码前就被预处理器移走。这也就导致其可能没进入symbol table。
且对浮点常量而言,预处理器盲目地将宏名称替换,可能导致object code出现多份
-
解决之道:
- 利用const替换define
const double ASPECT_RATIO = 1.653;
-
two points:
- 定义常量指针时,将指针声明成const
- 常量定义式通常放于头文件
- class专属常量
- 为确保此常量至多只有一份实体,必须让它称为static成员
- 定义常量指针时,将指针声明成const
-
define不重视scope,因此无法创建class的常量
class GamePlayer
{
private:
static const int Num = 5; //声明式
int scores[Num];
}
-
旧编译器也许不允许static成员在声明式获得初值,此时有两种方法可以解决:
- 将初值放在定义式,也就是实现文件内
- enum
- enum类型的数值可被当作ints使用
class GamePlayer { private: enum { Num = 5 }; int scores[Num]; }
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))
int a = 5,b = 0;
//此时,a的调用次数取决于被拿来和谁比较
CALL_WITH_MAX( ++a, b ); //a累加两次
CALL_WITH_MAX( ++a, b + 10 ); //a累加一次
-
以inline替换类似函数的宏
-
总结:
- 单纯常量,以const或enums替换#define
- 类似函数的宏,改用inline替换#define
标签:const,常量,Effective,int,enum,Num,define 来源: https://www.cnblogs.com/chenglixue/p/16387424.html