Effective C++ 条款02:尽量使用const,enum,inline替换#define
Effective C++ 条款02:尽量使用const,enum,inline替换#define
用另一句话说:用编译器代替预处理器比较好。
举个例子:加入定义一个常量:
#define ASPECT_RATIO 1.653
这个记号名称可能从未被编译器看到,可能在预处理时就会把代码中所有含有ASPECT_RATIO全部替换为1.653。
如果在编译期间报出编译的错误,编译器可能会提示的错误信息为1.653而不是ASPECT_RATIO,这样当代码量很多的时候会很迷惑,当追踪它时会浪费很多时间。所使用的ASPECT_RATIO也可能并未进入符号表(符号表是编译期产生的一个hash列表,记录函数名,变量等)。
解决办法就是讲#define更换为const
const double AspectRatio=1.653;//大写名称通常用于宏,这里改变名称写法
两种特殊情况:
- 定义常量指针
由于常量定义式通常被放在头文件中,以便被不同的源码文件包含,因此有必要将指针(不仅仅是指针指向的内容)声明为const,必须写成下面的形式:
const char* const firstCode="hello,world";
- class专属常量
为了将常量的作用域(scope)限制在class内,就必须让其成为类中的一个成员,为了确保这个常量最多只 有一份实体,就要将其用static修饰:
//Base类的声明式(非定义式)
class Base{
private:static const int data=5;//在这里声明为成员int array[data];//在这里使用
};
通常C++要求对于所使用的任何东西提供定义式,但如果它是class的专属常量又是static修饰,需特殊处理。只要不取地址就可以声明并使用它们而不需要定义。但是如果取某一个class专属变量的地址,或者不取地址但是编译器坚持要看到一个定义式,就比必须另外提供定义式,放入实现文件中而不是头文件:
const int Base::data;//data的定义式,由于class中已经给data赋值,定义时就不可以再赋值
尽量避免使用#define实现宏,虽然不会导致函数调用带来的额外开销,错误示范;
#define RETURN_MAX_NUMBER(a,b){return (a)>(b)?(a):(b);}
//这里所有变量都要括起来,否则可能会出现问题,但是就算都加上也会出现问题
int a=5,b=0;
RETURN_MAX_NUMBER(++a,b);//a会被累加两次
RETURN_MAX_NUMBER(++a,b+10);//a会被累加一次
如何解决这个呢?只要使用template inline(模板内联函数)函数:
template <typename T>
//编译器会直接将要使用这个方法的代码块嵌入代码中而无需调用
//通常一些简单的函数使用内联函数会更有效率
inline T RETURN_MAX_NUMBER(const T& a,const T& b)
{return a>b?:a,b;
}
对于预处理器而言,应当尽量少用,但是#include #ifdef/#ifndef也是继续需要用的。
Effective C++ 条款02:尽量使用const,enum,inline替换#define相关推荐
- C++尽量以const,enum,inline替换#define
最好编译器替换预处理器 以const替换#define 以enum替换#define 以inline替换#define 以const替换#define #define ASPECT_RATIO 1.6 ...
- Effective C++ item01 尽量以const enum inline替换#define
1.尽量用const.enum.inline代替宏#define 使用编译器替换预处理器,或许#define可以不被视为C++语言中的一部分,如下面的代码: #define PI 3.14 名称PI也 ...
- 2.尽量用const, enum, inline代替#define -- Prefer const, enum, inline to #define.
1. 我们都知道,#define PRICE 30 是预编译处理器进行预编译的时候执行的,无法在编译器进行编译的过程中看见,因此,当编译出错的时候,通常错误信息是提到30,而不是PRICE,因此程序员 ...
- 条款02:尽量以const,enum,inline代替#define
我们经常用define做什么? 1) 定义一个常量 2) 定义一个宏 为什么说尽量不用define.那么以这两个方面来解释: 1) 当我们定义一个常量时,我们可以用以下方式: #define A ...
- [EffectiveC++]item02:尽量以const,enum,inline代替#define
转载于:https://www.cnblogs.com/jeanschen/p/3214662.html
- C/C++面试:尽量以const、enum、inline替换#define
#defnie常量 原因 因为#define不被视为语言的一部分 问题 当定义: #define ASPECT_INFO 1.632 它可能不会被编译器看见: 在编译器开始处理源码之前就被预编译器移走 ...
- 条款一:尽量使用const、inline而不是#define
#define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号 ...
- Effective C++ 第二版 1)const和inline 2)iostream
条款1 尽量用const和inline而不用#define >"尽量用编译器而不用预处理" Ex. #define ASPECT_R 1.653 编译器永远不会看到AS ...
- Effective C++ 条款1、2、3、4
以下内容均来自Scott Meyers大师所著Effective C++ version3,如有错误地方,欢迎指正!相互学习,促进!! 条款1 视C++为一个语言联邦 理解C++,须认识其主要的次语言 ...
最新文章
- python opencv打开摄像头
- 被政治割裂的开源:伊朗开源拒绝来自以色列的PR
- jpa获取session_JPA 2 | 获取联接以及我们是否应该使用它们
- 阿里如何实现100%容器化镜像化?八年技术演进之路回顾(转)
- MySQL HandlerSocket插件 资料
- [canvas基础]pcmobile写字板
- fullscreen (JS 简易轻量化类原生的高兼容窗口全屏控件)
- HZK16汉字16*16点阵字库的使用及实例程序
- 图像转换成lmdb格式
- SpectralNet: Spectral Clustering Using Deep Neural Networks
- excel文件导入hive乱码_把数据库数据导出到excel
- iOS-将像素绘制到屏幕上
- 华为云服务器无数据盘也可以使用(数据盘非系统盘)
- P5.js码绘———拉普兰德做得到吗?
- Windows Git Bash 无法运行python解决方法
- Cocos2dx-- 资源热更新
- 获得文件绝对路径的小技巧
- Altium如何导入DXF/DWG文件
- 【干货分享】吴恩达老师的视频教程
- iOS多线程基本使用教程(Swift)