Item 2:Prefer consts, enums, and inlines to #defines

本文探讨了在C++编程中使用const和inline相较于#define的优势。详细分析了const与enum的区别,以及inline函数在避免宏定义缺陷方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个条款我们同样可以理解为 “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
  • 对于函数型的宏,我们倾向于使用inlinetemplate而不是#define
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值