这个条款我们同样可以理解为 “prefer the compiler to the preprocesor”
#define Accelerate_Rate 1.653
使用#define
不好的地方在于,编译器更本“看不见”符号Accelerate_Rate
,因为在预编译期间代码中所有Accelerate_Rate
都已经替换成了1.653
。这会导致之后代码出现问题Debug的时候,出错信息只会提示1.653
,这可能会导致你debug的困扰。
所以使用const
可能会是更好的选择
const double Accelerate_Rate = 1.653
在使用const
的时候,可能出现需要在类内进行使用,一般采用如下的方式,可以防止出现多个const
的数据
class Player{
private:
static const int MaxCount = 10;
};
// or
class Player{
private:
static const int MaxCount;
};
const int Player::MaxCount = 10;
对于·int
型的常数,我们还可以使用enum
class Player{
private:
enum {MaxCount = 10};
};
使用enum
的方式,其表现有点类似于使用#define
:对于const
类型的参数我们可以对其进行取地址,而对于enum
类型的参数进行取地址操作是非法的。
有很多时候,我们常采用#define
的方式定义些宏用来调用一些简短的函数,比如
#define Max(a, b) (a) > (b) ? (a) : (b)
这种方式有很多缺点,比如以下代码:
/*
* @Brief: file description
* @Author: liudy
* @Email: deyin.liu@nscc-gz.cn
* @Date: 2021-06-26 12:07:53
* @LastEditors: liudy
* @LastEditTime: 2021-06-26 12:12:10
*/
#include <iostream>
#define Max(a, b) (a) > (b) ? (a) : (b);
using namespace std;
int main() {
int a = 5, b = 0;
int c = Max(++a, b);
cout << "c = " << c << " a = " << a << endl;
c = Max(++a, b + 10);
cout << "c = " << c << " a = " << a << endl;
return 0;
}
输出为
c = 7 a = 7
c = 10 a = 8
可以看出第一次Max
的调用使得a
增加了2,而第二次调用则使得a
增加了1。出现该情况的原因在于:进行第一次调用时宏替换后表示为
c = (++a) > (b) ? (++a) : (b)
首先该行代码对(++a)
与(b)
进行比较,由于(++a)
更大,使得后面(++a)
进行了执行,变量a
自增了两次。
第二次调用宏替换后表示为
c = (++a) > (b + 10) ? (++a) : (b + 10)
首先该行代码对(++a)
与(b + 10)
进行比较,由于(b + 10)
更大,使得后面(b + 10)
进行了执行,变量a
自增了1次。
所以更好的方式是使用inlne
加模板函数的方式
template<class T>
inline T Max(const T&a, const T&b) {
return a > b ? a : b;
}
总结
- 对于简单的常数需求,我们更倾向于使用
const
或者enum
而不是#define
- 对于函数型的宏,我们倾向于使用
inline
加template
而不是#define