《Effecive C++》——条款02

条款-02-尽量以 const、enum、inlinen 替换 #define

1-对于单纯常量,最好以 const 对象 或 enums 替换 #defines。

2-对于形似函数的宏(macros),最好改用 inline 函数替换 #defines。

  1. 在用**#define**进行预处理时:
#define AA 1.653

​ 可能会在记号式调试器(symbolic debugger)中,名称 AA 未进入记号表(symbol table)或者编译器未看见 AA 而产生误差。

解决方法是:利用 const来替换上述的宏(#define):

const double AA = 1.653;
  1. 当我们以常量替换 #defines时,有两种情况需要说说:常量指针(constant pointers)和 class 专属常量

    • 常量指针:由于常量定义式通常被放在头文件中(以便被不同的源码含入),因此有必要将指针(而不是指针所指之物)声明为 const

      //eg. 若要在头文件内定义一个常量的(不变的) char*-based字符串,必须写两次 const:
      const char* const AAA = "abcdefg";
      
      //若写成
      const string AAA("abcdefg");
      //或者
      const string AAA = "abcdefg";
      //会更好
      
    • class 专属常量:为了将常量的作用域(scope)限制于class内,必须让它成为class的一个成员(member);而为确保此常量至多只有一份实体,必须让它成为一个static成员:

      class GamePlayer
      {
        private:
          static const int Num = 5;	//常量声明式
          int score[Num]				//使用该常量
      };
      

      另外,我们无法利用 #define 创建一个 class 专属常量,因为 #define 并不重视作用域(scope)。

    1. 不用 #define 的实例:(容易乱加)

      #define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
      
      //在主函数中:
      int a=5, b=0;
      CALL_WITH_MAX(++a,b);		//a被累加2次
      CALL_WITH_MAX(++a,b+10)		//a被累加1次
      
      

    小结:

    ​ 有了const、enum 和 inline ,我们对预处理器(特别是 #define)的需求降低了,但并非完全消除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值