条款2:尽量以const,enum,inline替换#define
2012-08-15 17:18
211 查看
个人认为可能本条款更名为“尽量避免#define的使用”可能更好吧,因为从目的上讲是因为#define有一些不便或者说问题,从而想到要用别的东西来替换它,如果它很方便且没有什么问题为什么要替换他呢。
一、#define的问题
1.类似 #define ASPECT_RATIO 1.653 这样的常量定义时,符号名ASPECT_RATIO会因为未进入符号表,而在编译错误和debug时引入不必要的困扰。
2.#define定义的常量无法使用类的作用域,无法定义类似private #define ASPECT_RATIO 这样的东西。一旦宏被定义,它就在其后的编译过程中一直有效,除非在某处被#undef。这显然是于面向对象的封装性相违背的,而且也有名字污染的可能性。
3. #define定义带参数的宏用以代替函数。例如:
#define MAX( a, b) ( ( a ) > ( b ) ) ? ( a ) : ( b )
这种带参数的宏可能带有的隐患是宏的错误展开,具体我就不展开了。
二、替代方法
对于问题1,const常量和enum都可以考虑。enum的数值可以权充整型使用。
对于问题2,方法一,使用static const,如
头文件中:
class CostEstimate
{
private:
static const double FudgeFactor;
....
};
cpp中:
const double CostEstmate::FudgeFactor = 1.35f;
这样可以将常量FudgeFactor的作用域限制在class中,并确保此常量至多只有一份实体。
方法二, 如常量是整型,则可用enum代替之。如:
class GamePlayer
{
enum { NumTurns = 5};
int scores[NumTurns];
};
在可能的情况下,个人感觉方法二,更简洁些。
对于问题三,template inline 函数可能是一个好的选择。但是带参数的宏的并不能被template inline函数完全代替
转自:/article/5453914.html
一、#define的问题
1.类似 #define ASPECT_RATIO 1.653 这样的常量定义时,符号名ASPECT_RATIO会因为未进入符号表,而在编译错误和debug时引入不必要的困扰。
2.#define定义的常量无法使用类的作用域,无法定义类似private #define ASPECT_RATIO 这样的东西。一旦宏被定义,它就在其后的编译过程中一直有效,除非在某处被#undef。这显然是于面向对象的封装性相违背的,而且也有名字污染的可能性。
3. #define定义带参数的宏用以代替函数。例如:
#define MAX( a, b) ( ( a ) > ( b ) ) ? ( a ) : ( b )
这种带参数的宏可能带有的隐患是宏的错误展开,具体我就不展开了。
二、替代方法
对于问题1,const常量和enum都可以考虑。enum的数值可以权充整型使用。
对于问题2,方法一,使用static const,如
头文件中:
class CostEstimate
{
private:
static const double FudgeFactor;
....
};
cpp中:
const double CostEstmate::FudgeFactor = 1.35f;
这样可以将常量FudgeFactor的作用域限制在class中,并确保此常量至多只有一份实体。
方法二, 如常量是整型,则可用enum代替之。如:
class GamePlayer
{
enum { NumTurns = 5};
int scores[NumTurns];
};
在可能的情况下,个人感觉方法二,更简洁些。
对于问题三,template inline 函数可能是一个好的选择。但是带参数的宏的并不能被template inline函数完全代替
转自:/article/5453914.html
相关文章推荐
- [effectiv c++]条款2:尽量以const,enum,inline替换#define(static,const定义式)
- 条款02:尽量以const,enum,inline替换#define
- 《Effective C++读书笔记》--条款02尽量以const,enum,inline替换#define
- 条款2:尽量以CONST,ENUM,INLINE替换#DEFINE
- Effective C++_笔记_条款02_尽量以const、enum、inline替换#define
- 条款2:尽量以const,enum,inline 替换 #define
- 条款02 尽量以const ,enum,inline替换#define
- 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define
- 《Effective C++》条款02:尽量以const,enum,inline替换#define
- 条款2:尽量以const, enum, inline 替换#define
- effective C++(第三版)读书笔记一——条款二:尽量以const,enum,inline替换#define
- 条款2:尽量以const,enum,inline替换#define
- Effective C++--条款02:尽量以const,enum,inline替换#define(以编译器替换预处理器)
- [Effective C++]条款02:尽量以const,enum,inline 替换#define
- 条款2:尽量以const、enum、inline替换#define
- 条款02:尽量以const,enum,inline替换#define(Prefer const,enum,inline to #define)
- 《Effective C++》学习笔记条款02 尽量以const,enum,inline替换#define
- Effective C++ 条款02解读: 尽量以const, enum, inline替换#define
- 条款02:尽量以const,enum,inline替换#define疑问
- Effective C++ 读书笔记——条款2:尽量以const,enum,inline替换#define