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

本文探讨了C/C++中预处理宏#define存在的问题,包括符号表污染、作用域限制及宏展开错误等,并提出了使用const常量、enum及模板内联函数作为替代的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  个人认为可能本条款更名为“尽量避免#define的使用”可能更好吧,因为从目的上讲是因为#define有一些不便或者说问题,从而想到要用别的东西来替换它,如果它很方便且没有什么问题为什么要替换他呢。

  一、#define的问题

  1.类似 #define  ASPECT_RATIO 1.653 这样的常量定义时,符号名ASPECT_RATIO会因为未进入符号表,而在编译错误和debug时引入不必要的困扰。

  2.#define定义的常量无法使用类的作用域,无法定义类似private #define ASPECT_RATIO 这样的东西。一旦宏被定义,它就在其后的编译过程中一直有效,除非在某处被#undef。这显然是于面向对象的封装性相违背的,而且也有名字污染的可能性。

      3. #define定义带参数的宏用以代替函数。例如:

      #define MAX( a, b)  ( ( a ) > ( b ) ) ? ( a ) : ( b )

          这种带参数的宏可能带有的隐患是宏的错误展开,具体我就不展开了。

 

    二、替代方法

        对于问题1,const常量和enum都可以考虑。enum的数值可以权充整型使用。

        对于问题2,方法一,使用static const,如

    头文件中:

                  class CostEstimate

                  {

                     private:

                           static const double FudgeFactor;

                            ....

                   };

            cpp中:

                 const double CostEstmate::FudgeFactor = 1.35f;

 

        这样可以将常量FudgeFactor的作用域限制在class中,并确保此常量至多只有一份实体。

        方法二, 如常量是整型,则可用enum代替之。如:

        class GamePlayer

        {

     enum { NumTurns = 5};

             int scores[NumTurns];

         };

         在可能的情况下,个人感觉方法二,更简洁些。

       对于问题三,template inline 函数可能是一个好的选择。但是带参数的宏的并不能被template inline函数完全代替


转自:http://www.cnblogs.com/topicofkevin/archive/2012/02/19/2358654.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值