您的位置:首页 > 其它

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

2014-05-21 19:32 225 查看
条款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),而且已经没有类型在符号表,在编译时不做安全检查。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: