const,enum,inline替换#define
来源:互联网 发布:金庸小说 知乎 话题 编辑:程序博客网 时间:2024/05/16 17:25
基本上使用预处理指令#define的地方都可以使用const,enum或者inline来替换掉它。主要的原因有两个:
#define ASPECT_RATIO 1.653
1.预处理指令是在编译前就进行预处理的(gcc -E进行预处理,它的输出文件作为gcc -S进行编译的输入),所以编译器是看不到#define定义的符号ASPECT_RATIO ,故它不会出现在符号表中,这样如果编译期间出现了错误它可能只提示常量1.653,如果这个文件又不是你写的,那么调试会很困难。
2.使用常量可能比使用#define产生更少的代码,#define进行替换的时候会将ASPECT_RATIO 都替换成1.653,这样在目标代码中会出现多个1.653,但是使用const就不会有这个问题。
基于以上两个原因应该尽可能在使用#define的时候替换成const,enum,或者inline
使用const替换
如果需要在一个类中使用一个常量,可以在类内定义一个static const的常量来避免使用#define。static和const这两个关键字可以参考之前的这篇博客。
class GamePlayer{private:static const int intNum=5;//常量声明式int scores[intNum];//使用该常量};
如果需要取intNum的地址,还需要在实现文件中加上:
const int GamePlayer::intNum;//定义
如果这个常量不是整型的,那么它不能在类中就赋初值,只能在实现文件中赋初值。但是如果编译器不支持整型在声明时就指定一个初值,可以使用枚举类型来替代。
使用enum替换
class GamePlayer{private:enum {NumTurns=5 };int scores[NumTurns];//使用枚举类型};
这样就可以避免使用的,需要注意的是不要对枚举变量进行取址操作,因为&操作符需要的操作数是左值,而枚举变量是右值,在gcc中使用取址操作时会出现下面的编译错误:
使用inline替换
#define可以用来实现宏:
#define MAX(a,b) ((a)>(b)?(a):(b))
使用宏的好处是它不会带来函数调用时的开销,但是这个问题可以通过inline关键字和模板来解决。使用上面的宏会有一个不可避免的问题:
int a=5,b=0;
MAX(++a,b);//a被累加一次
MAX(++a,b+10);//被累加两次
上面的宏可以通过函数模板来解决这个问题,它即避免了函数调用的开销,也解决了宏的问题:
template<class T>inline void max(const T & a,const T & b)//注意这里使用常量引用的形式{return a>b?a:b;}
- const,enum,inline替换#define
- 尽量以const、enum、inline替换#define
- 尽量以const,enum,inline替换#define
- 尽量以const,enum,inline替换#define
- 尽量以const、enum、inline替换#define
- 尽量以const,enum,inline替换#define
- 条款02:尽量以const,enum,inline替换#define(Prefer const,enum,inline to #define)
- [C++]尽量以const,enum,inline替换#define
- 条款02:尽量以const,enum,inline替换#define
- 条款2:尽量以CONST,ENUM,INLINE替换#DEFINE
- 条款02:尽量以const, enum, inline 替换 #define
- EffictiveC++笔记之用const、enum、inline替换define
- 条款2:尽量以const,enum,inline替换#define
- 《Effective C++》尽量以const,enum,inline,替换#define
- 条款2:尽量以const,enum,inline替换#define
- 条款2:尽量以const, enum, inline 替换#define
- 尽量不要使用#define,而是用const、enum、inline替换。
- item2: 尽量以const,enum,inline替换#define
- VM安装小问题
- eclipse JDBC 基本操作
- proguard 原理
- Linux下安装配置JDK
- android开发笔记(1-5)(易错点以及技术难点攻克)
- const,enum,inline替换#define
- C++特别注意的特性
- 指令系统--题目
- 对象的序列化与反序列化
- C# 实现Excel转Word、Word转PDF、合并PDF
- Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition) 阅读笔记(Part V)
- GOF23之原型模式Demo
- Linux中各目录含义
- linux i2c 24c08 tiny6410 一个24c08的设备驱动