条款02:尽量以const,enum,inline 替换 #define

条款02:尽量以const,enum,inline 替换 #define

        • 1.定义一个常量

知识点:
1 宏函数和函数的区别
2 详解宏定义(#define) – 值得去看

我们常用define做什么:1.定义一个常量,2.定义一个宏

1.定义一个常量

当我们定义一个常量时,我们可以用以下方式:

#define ASPECT_PATIO 1.653

我们知道编译器并没有看到ASPECT_PATIO符号(为什么?复习程序的预编译,编译,链接,运行)。于是这个记号ASPECT_PATIO并没有进行编译器的记号表内。恰巧如果我们获得了一个编译时期的错误,这个错误信息中会提到1.653而不是ASPECT_PATIO。这时,你会感到不解。

如果这个符号ASPECT_PATIO并没有定义在此文件内,则你就可能一头雾水。

引起这两种情况的原因都是:你所使用的名称可能未进入记号表。

解决措施:
我们可以用一个const常量来替换上面的宏。

Const double AsspectRation = 1.653;

作为一个语言常量,它是被编译器看到的,并且记录到符号表中.此外对于浮点常量而言,使用常量可能比使用#define导致较小的代码量,因为预处理器"盲目地将宏名称为ASPECT_PATIO替换为1.653"可能导致目标代码出现多份1.653,若改用常量AsspectRation 绝不会出现相同的情况.

class专属常量
用const 来代替define还有一个好处是可以定义一个类的专属常量。但是define没有类域的影响。
为了将常量的作用域限制在class内,你必须让它成为class中的一个成员,而为了确保次常量至多只有一份实体,你必须让它成为一个static成员:

class GamePlayer {
private:
	static const int NumTurns = 5;		// 常量声明式
	int scores[NumTurns];				// 使用该常量
	...
}

旧式编译器也许不支持上述语法,他们不允许static成员在其声明式上获得处置.此外所谓的"in-class 初值设定" 也只允许对整数常量进行.如果你的比编译器不支持上述语法,你可以将初值放在定义式:

class CostEstimate {
private:
	static const double FudgeFactor;	// static class 常量声明
	...									// 位于头文件内
};
// static class 常量定义
const double CostEstimate:FudgeFactor = 1.35;   // 位于实现文件内

你可能感兴趣的:(effective,C++,替换#define)