effective4 条款二 慎用预编译器#define
来源:互联网 发布:simulink怎么增加端口 编辑:程序博客网 时间:2024/06/08 17:41
一 #define ASPECT_RATIO 1.653
通常用如下代替:(定义一个常量替代宏)
const double AspectRatio=1.653(通常用大写字母写宏)
以常量替代#defines,有两种特殊情况:
1 定义常量指针
........→(常量定义式通常被放在头文件中,以便不同的代码含入,所以指针定义为const)常量字符串 const char* const authorName = " ABC"
→(string 对象比 char *更好,所以更适宜学成) const std::string authorName =" ABC"
2 class专属常量
........→class GamePlayer {
private:
static (静态变量) const int NumTurns= 5; //常量声明式
int scores[NumTurns]; //使用该常量
......
};
注意:上面是NumTurns的声名式而非定义式(通常c++要求提供定义式,但有一种情况特殊:它是1 class专属常量; 2 static; 3 整数型常量;4 不取它的地址)
如果要求找NumTurns的地址,则需提供定义式如下:
const int GamePlayer::NumTurns
二 #defines不能用来定义class的专属常量,也不能够提供任何封装性
三 旧式编译器可能不支持一 2 的语法(不允许static在声明式里定义常量),这时可以这样实现:
class GamePlayer{
private:
static const int NumTurns;
....
};
const int GamePlayer::NumTurns =5;
或:
class GamePlayer {
private:
enum{ NumTurns= 5} ;//常量声明式
int scores[NumTurns]; //使用该常量
......
};
四 注意不能用#define来实现宏。宏看起来像函数,但不会招致函数调用带来的额外开销,如以下错误示例:#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
而应该用以下template inline函数代替:
template <typename T>
inline void CallWithMax(const T&a,const T&b)
{
f(a>b?a:b)
}
- effective4 条款二 慎用预编译器#define
- 预编译#define #ifdef #endif
- ifndef define endif预编译
- 预编译#ifndef #define #endif
- cpp语言预编译语句define浅谈
- IOS #define和预编译指令
- 预编译(二)
- [收藏]预编译指令 #ifndef #define #endif 的用法
- 关于预编译条件(#ifndef......#define......#endif)的使用
- 预编译那些事#define后面只跟一个“参数”
- 杂货边角(5):预编译指令#家族define/pragma
- 《effective c++》条款二:尽量以enum,const,inline替换#define
- C预编译器
- 预编译器
- 浅谈VC++中的预编译(二)
- 面试复习二:预编译期
- 浅谈#define预编译指令在J2ME项目管理中的作用
- 浅谈#define预编译指令在J2ME项目管理中的作用
- <? extends SomeClass>与<T extends SomeClass>的区别
- @property
- Opencv--视频操作基础
- Fragment 不响应onActivityResult
- Java并发-类库新组件 - Semaphore 理解:计数信号量
- effective4 条款二 慎用预编译器#define
- 程序员的干货:20条传说中的犯贱心理学(单身狗的福利)
- iOS 隐私政策url
- Android RelativeLayout属性
- 文献笔记:《Fitting a 3D Morphable Model to Edges: A Comparison Between Hard and Soft Correspondences》读后感~
- MySQL的性能优化
- RxJava 转换操作符scan
- IDT
- 时间复杂度