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;//大写名称通常用于宏,这里改变名称写法

两种特殊情况:

  1. 定义常量指针
    由于常量定义式通常被放在头文件中,以便被不同的源码文件包含,因此有必要将指针(不仅仅是指针指向的内容)声明为const,必须写成下面的形式:
const char* const firstCode="hello,world";
  1. 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相关推荐

  1. C++尽量以const,enum,inline替换#define

    最好编译器替换预处理器 以const替换#define 以enum替换#define 以inline替换#define 以const替换#define #define ASPECT_RATIO 1.6 ...

  2. Effective C++ item01 尽量以const enum inline替换#define

    1.尽量用const.enum.inline代替宏#define 使用编译器替换预处理器,或许#define可以不被视为C++语言中的一部分,如下面的代码: #define PI 3.14 名称PI也 ...

  3. 2.尽量用const, enum, inline代替#define -- Prefer const, enum, inline to #define.

    1. 我们都知道,#define PRICE 30 是预编译处理器进行预编译的时候执行的,无法在编译器进行编译的过程中看见,因此,当编译出错的时候,通常错误信息是提到30,而不是PRICE,因此程序员 ...

  4. 条款02:尽量以const,enum,inline代替#define

    我们经常用define做什么? 1)  定义一个常量 2)  定义一个宏 为什么说尽量不用define.那么以这两个方面来解释: 1)  当我们定义一个常量时,我们可以用以下方式: #define A ...

  5. [EffectiveC++]item02:尽量以const,enum,inline代替#define

    转载于:https://www.cnblogs.com/jeanschen/p/3214662.html

  6. C/C++面试:尽量以const、enum、inline替换#define

    #defnie常量 原因 因为#define不被视为语言的一部分 问题 当定义: #define ASPECT_INFO 1.632 它可能不会被编译器看见: 在编译器开始处理源码之前就被预编译器移走 ...

  7. 条款一:尽量使用const、inline而不是#define

    #define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号 ...

  8. Effective C++ 第二版 1)const和inline 2)iostream

    条款1 尽量用const和inline而不用#define >"尽量用编译器而不用预处理" Ex. #define ASPECT_R 1.653    编译器永远不会看到AS ...

  9. Effective C++ 条款1、2、3、4

    以下内容均来自Scott Meyers大师所著Effective C++ version3,如有错误地方,欢迎指正!相互学习,促进!! 条款1 视C++为一个语言联邦 理解C++,须认识其主要的次语言 ...

最新文章

  1. python opencv打开摄像头
  2. 被政治割裂的开源:伊朗开源拒绝来自以色列的PR
  3. jpa获取session_JPA 2 | 获取联接以及我们是否应该使用它们
  4. 阿里如何实现100%容器化镜像化?八年技术演进之路回顾(转)
  5. MySQL HandlerSocket插件 资料
  6. [canvas基础]pcmobile写字板
  7. fullscreen (JS 简易轻量化类原生的高兼容窗口全屏控件)
  8. HZK16汉字16*16点阵字库的使用及实例程序
  9. 图像转换成lmdb格式
  10. SpectralNet: Spectral Clustering Using Deep Neural Networks
  11. excel文件导入hive乱码_把数据库数据导出到excel
  12. iOS-将像素绘制到屏幕上
  13. 华为云服务器无数据盘也可以使用(数据盘非系统盘)
  14. P5.js码绘———拉普兰德做得到吗?
  15. Windows Git Bash 无法运行python解决方法
  16. Cocos2dx-- 资源热更新
  17. 获得文件绝对路径的小技巧
  18. Altium如何导入DXF/DWG文件
  19. 【干货分享】吴恩达老师的视频教程
  20. iOS多线程基本使用教程(Swift)

热门文章

  1. win10安装keil5
  2. 大数据分析的道与术总结
  3. mmyolo训练yolov5~ppyoloe
  4. EROFS文件系统工具简介
  5. 四种方式 模拟并发,你的API接口扛得住不?
  6. malloc、calloc、realloc、free、malloc_trim
  7. 一路向西17天之 乌市-布尔津-空中花园-禾木
  8. 年纪轻轻就要秃了?别怕,用它,让你重新找回浓密秀发!
  9. python英汉互译词典下载_python字典如何实现英汉互译
  10. html 手风琴折叠,各种姿势教你写手风琴式折叠菜单