1> 以const替换#define

• 比如用const double Ratio = 1.653替换#define RATIO 1.653

因为宏定义在预处理阶段就会被替换成其所指代的内容,然后才是对替换后的内容进行编译,因此编译器永远不能发现宏的存在。此时如果宏变量RATIO出现问题,那么编译器只会报出是1.653出现问题,是不是相当莫名其妙?究其原因就是所使用的宏变量压根没进入到符号表中,编译器看不到。

 如何定义类内常量,就是对该类而言只有一份的那种变量?当然我们会想到static,如果加上const会更好,但此时#define就不行了,如果用#define定义了所谓的私有宏,那么在其定义后都可以访问,因此#define没有scope限制,如下所示:

 #include<iostream>

 class GamePlayer
{
private:
static const int Nums = ; // 常量的声明而非定义
int scores[Nums];
#define NUMS 5 // 定义所谓的私有宏
}; int main()
{
std::cout << NUMS << std::endl; // 可以随时访问,不受类作用域限制
return ;
}

如上,此时的类内常量定义就没有任何意义了。

接着讨论static const定义,定义应该放在哪?

一般而言,我们所定义的类都放在头文件中,那么类内常量的定义当然是放在源文件中了,在源文件中就像下面这样定义即可:

const int GamePlayer::Nums;   // 常量在使用前必须定义

当然你也可以在声明时不初始化,等到定义时再赋值也是一样的。

2> 以enum替换#define

我们也可以使用enum来实现类内的常量定义,如下所示:

 class GamePlayer
{
private:
enum{ Nums = 5 }; // 以enum定义常量
int scores[Nums];
};

其实enum的行为和#define更像一些,因为我们不能取一个#define的地址,同样也不能取一个enum的地址,但是我们可以取一个const常量的地址。

3> 以inline替换#define

假设我们有如下宏定义:

#define CALL_MAX(a, b) f((a) > (b) ? (a) : (b))

可以替换如下:

 template<typename T>
inline void callMax(const T& a, const T& b)
{
f(a > b ? a : b);
}

如上替换之后就不用再担心宏参数的加括号问题,同时也使代码变得简洁明了。再者说,定义类内的private inline函数也毫无问题,而#define绝对不能胜任。

总结:

  • 对于单个常量,以const或enum替换#define定义。
  • 对于带参数的宏,以inline函数替换#define定义。

条款2:尽量以const、enum、inline替换#define的更多相关文章

  1. 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define

    其实这个条款分成两部分介绍会比较好,第一部分是用const和enum替换不带参的宏,第二部分是用inline替换带参的宏. 第一部分:用const和enum替换不带参宏 宏定义#define发生在预编 ...

  2. Effective C++阅读笔记_条款2:尽量以const,enum,inline替换#define

    1.#define缺点1 #define NUM 1.2 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道1.2的含义. 改善:通过const int NUM = 1.2; 2.#dein ...

  3. Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define

    尽量使用const替换 #define定义常量的原因: #define 不被视为语言的一部分 宏定义的常量,预处理器只是盲目的将宏名称替换为其的常量值,导致目标码中出现多分对应的常量,而const定义 ...

  4. 条款2:尽量以const, enum, inline替换#define

    原因: 1. 追踪困难,由于在编译期已经替换,在记号表中没有. 2. 由于编译期多处替换,可能导致目标代码体积稍大. 3. define没有作用域,如在类中定义一个常量不行. 做法: 可以用const ...

  5. 条款02:尽量以const,enum,inline替换#define

    目录 1. 总结 2. 使用const常量或enum替换宏常量 class外部的常量指针 class专属常量 1. 总结 对于单纯常量,最好以const常量或enum替换#define 对于宏代码段, ...

  6. NO.2: 尽量以const,enum,inline 替换 #define

    1.首先#define 定义不重视作用域(scope),虽然可以#undef控制,但是不美观,还存在多次替换的问题,以及没有任何封装性. 2.const XXX_XX,保证其常量性以及可控的作用域,如 ...

  7. Effective C++ -----条款02:尽量以const, enum, inline替换 #define

    class GamePlayer{private: static const int NumTurns = 5; int scores[NumTurns]; ...}; 万一你的编译器(错误地)不允许 ...

  8. 条款2:尽量使用const ,enum,inline替换define

    宁可使用编译器而不用预处理器 假设我们使用预处理器: #define ABC 1.56 这标识符ABC也许编译器没看到,也许它在编译器处理源码前就被预处理器移走了,于是“标识符”ABC没有进入标识符列 ...

  9. Effective C++之条款2:尽量以const enum inline替换 #define

    本文的标题也可以改成“用编译器替换预处理器”: const double AspectRatio = 1.653; //最好使用上述代码替换下述代码: #define ASPECT_RATIO 1.6 ...

  10. Book. Effective C++ item2-尽量使用const, enum, inline替换#define

    ##常规变量 c++里面的#define后面的定义部分,是不算代码的一部分的.所以如果你使用#define: #define ASPECT_RATIO 1.653 你希望这个代号ASPECT RATI ...

随机推荐

  1. Maven 的41种骨架

    1: internal -> appfuse-basic-jsf (创建一个基于Hibernate,Spring和JSF的Web应用程序的原型) 2: internal -> appfus ...

  2. jQuery之Nestable

    空间属性置顶: 属性 说明 change 事件,当控件改变时触发 nestable 方法,获取顺序JSON数据,形式如下: [{"id":1},{"id":2} ...

  3. 对于不是特别擅长Photoshop的人来说,熟悉和运用Photoshop工具提供的各类便捷的快捷键,是有帮助的。

    应用程序菜单快捷键之文件   应用程序菜单快捷键之编辑   应用程序菜单快捷键之图像图层   应用程序菜单快捷键   应用程序菜单快捷键之视图     Ctrl + H  取消参考线     调板菜单 ...

  4. 关于java classpath问题

    在配置java环境的时候,有一个classpath,这是jre寻找.class文件的路径.一般会设置为当前路径".;%JAVA_HOME%\lib;",前面的.为当前路径 如果没有 ...

  5. JSF的ui标签

    在使用自己的tag时,首先需要在web.xml里面进行注册,注册方式是在web.xml开头加上:  <context-param>        <param-name>fac ...

  6. Unieap3.5-Grid翻页不提示修改

    <toolbar export="{defaultType:'server'}" paging="{onPagingModified:ssSettleCheck.o ...

  7. win7发送到菜单

    在文件浏览器地址栏输入 shell:sendto

  8. Python之路【第五篇】:面向对象及相关

    Python之路[第五篇]:面向对象及相关   面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ...

  9. javaSE27天学习目录

      第一阶段(java基础知识) 计算机基础知识 Java开发环境的搭建和应用 机制转换 有符号数据表示法(原码.反码.补码) Java语句基础(关键字.标识符.注释.常量.变量.数据类型.运算符) ...

  10. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入

    本篇将介绍Asp.Net Core中一个非常重要的特性:依赖注入,并展示其简单用法. 第一部分.概念介绍 Dependency Injection:又称依赖注入,简称DI.在以前的开发方式中,层与层之 ...