条款2:尽量以const,enum,inline 替换 #define
2014-05-21 19:32
225 查看
条款2:尽量以const,enum,inline 替换 #define
宏定义的变量在编译器预处理时将CHANNEL_NUM当做符号直接替换,致使该定义没有进入符号表,导致编译时,编译器直接忽略对宏的安全检查,导致代码调试只看到数字10,没有具体含义,而常量声明则反。下一个条款会详细介绍const变量。
有些编译器可以在类中直接定义静态常量成员,但有些是需要在类外实现文件重新定义
enum {NUM = 10};
查看结果,发现宏函数的值不是意料到的。
内联函数像普通函数一样, 要进行参考类型检查, 但执行内联函数要比执行普通函数更高效, 因为调用内联函数的地方不需要中断调用,不需要对函数参数进行入栈和出栈开销, 在编译的时候, 内联函数被嵌入到目标代码中,与宏有同样的效率
宏的字符替换在预处理期间完成(由预处理器执行),导致调用Max展开为 (a++) > (b) ? (a++) : (b),而且已经没有类型在符号表,在编译时不做安全检查。
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),而且已经没有类型在符号表,在编译时不做安全检查。
相关文章推荐
- 条款2:尽量以const、enum、inline替换#define
- effective C++(第三版)读书笔记一——条款二:尽量以const,enum,inline替换#define
- 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define
- 条款02:尽量以const,enum,inline替换#define疑问
- 条款2:尽量以const,enum,inline替换#define
- [Effective C++]条款02:尽量以const,enum,inline 替换#define
- 条款02:尽量以const,enum,inline替换#define(Prefer const,enum,inline to #define)
- 条款2:尽量以const, enum, inline 替换#define
- Effective C++ 读书笔记——条款2:尽量以const,enum,inline替换#define
- 条款02 尽量以const ,enum,inline替换#define
- 条款2:尽量以const,enum,inline替换#define
- Effective C++_笔记_条款02_尽量以const、enum、inline替换#define
- Effiective C++条款第二条 尽量以const,enum,inline,替换#define
- Effective C++ 条款02解读: 尽量以const, enum, inline替换#define
- Effective C++--条款02:尽量以const,enum,inline替换#define(以编译器替换预处理器)
- <Effective C++>条款02:尽量以const,enum,inline替换#define
- 《Effective C++》学习笔记条款02 尽量以const,enum,inline替换#define
- 条款02:尽量以const,enum,inline替换#define
- 读书笔记《Effective C++》条款02:尽量以const,enum,inline替换#define
- Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define