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

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

1、const与#define

1、1普通常量定义

#define CHANNEL_NUM 10   //宏定义

const int channel_num = 10;  //常量定义
宏定义的变量在编译器预处理时将CHANNEL_NUM当做符号直接替换,致使该定义没有进入符号表,导致编译时,编译器直接忽略对宏的安全检查,导致代码调试只看到数字10,没有具体含义,而常量声明则反。下一个条款会详细介绍const变量。
const char * const channelName  = "GPRS";  //定义一个指向常量的常量指针

1、2类常量定义

类普通常量成员不能在类中初始化,因为常量属于对象,每个对象有自己的常量,且需要在构造函数的初始化列表中进行初始化,因为常量没有赋值之说(引用也一样)。为类定义一个专属的常量,可以声明为静态成员。
class Channel
{
public:
	int GetChannelNum() const
	{
		return m_num;
	}

private:
	static const int m_num = 10;
	int m_channelPool[m_num];
};
有些编译器可以在类中直接定义静态常量成员,但有些是需要在类外实现文件重新定义
const int Channel::m_num;

2、enum与#define

既然有些编译器不支持在类中直接给静态常量成员初始化,那么在类中声明的m_channelPool数组会因为未知数组大小而出错,因此我们引入enum解决这个问题。enum的详细用法后续再写
enum {NUM = 10};

3、inline 与 #define

#define Max(a, b) (a) > (b) ? (a) : (b)  //宏函数

inline int GetMax(int a, int b)   //内联函数
{
	return a > b ? a : b;
}
	int a = 10;
	int b = 5;
	//int max = Max(a++, 5);
	int max = GetMax(a++, b);
	cout<<"after Max a :"<<a<<" Max:"<<max<<endl;

查看结果,发现宏函数的值不是意料到的。
    内联函数像普通函数一样, 要进行参考类型检查, 但执行内联函数要比执行普通函数更高效, 因为调用内联函数的地方不需要中断调用,不需要对函数参数进行入栈和出栈开销, 在编译的时候, 内联函数被嵌入到目标代码中,与宏有同样的效率
    宏的字符替换在预处理期间完成(由预处理器执行),导致调用Max展开为 (a++) > (b) ? (a++) : (b),而且已经没有类型在符号表,在编译时不做安全检查。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值