• EC笔记,第一部分:2.尽量以const,enum,inline代替#define


    02.尽量以constenuminline代替#define

    原因:编译前的预处理会替换宏,所以调试的时候找不到错误

    1.const

                尽量用const替代常量宏定义

                两种特殊情况:

                            (1).常量指针

                                        通常定义为const char * const cstr="hello world";

                                        即要把指针本身定义为const,而不仅仅是指针指向的值,通常用string替代char*-based:

                                                    const string str("hello world");

                            (2).class专属常量

                                        为了确保const成员只有一个实体,通常使用static将其声明为静态常量,但是在类中的声明仅仅是声明,类中不存在定义,即使形如:

    class MyClass{//头文件中

        public:

           static const int t=5;//仅仅是声明

           int arr[t];//可以使用该常量

    };

    //源文件中(实现文件中)

    const int MyClass::t;//此处是定义因为在声明的时候已经赋值所以在此处不可赋值

                                        如果只声明而不定义,那么对该成员无法取地址,如果没有需要取地址的操作,可以只声明不定义(仅适用于ints类型(如int,char,bool)),但是对于非整数型数据,定义式必须存在(C++11不适用,C++11已经支持在类内部赋值),即:

    class MyClass{//头文件中

        public:

           //static const double t=5.1;//错误,类中不可赋值(非C++11

           static const double t;

           int arr[t];//可以使用该常量

    };

    //源文件中实现文件中

    const double MyClass::t=5.1;//此处是定义必需

    2.enum

                假设你的编译器不支持在类中如此声明static const int t=5;但是你确实在编译时需要一个整形常量那么可以用enum{t=5};

          enum更接近于#define例如你可以取一个const的地址但是不能取enum的地址当然#define的常量也不可取地址

                事实上,enum是模板元编程的基础技术

    3.inline

                将宏定义为像一个函数通常是让你陷入到调试漩涡中的一个重要原因,所以,尽量不要将宏定义为一个函数形式(事实上,应该尽量避免使用宏),宏只是机械式的替换,而不做类型检查等工作,而且宏的参数如果是一个表达式,错误的风险将会增加,而通过模板与内联(template,inline)可以解决这些棘手的问题

     

     

    总结:对于单纯常量,使用const与enum代替宏,对于函数形式的宏,则使用inline与template替代

     

     

  • 相关阅读:
    如何管理自己的文件夹
    Mybatis 笔记
    Try Catch Finally
    Java JDK安装小谈
    android 相关学习笔记
    nodejs 复制目录,调用cmd命令
    ajax图片上传,基于firefox
    一切皆命令
    javascript 之牛人感悟,必看学习
    jQuery中添加自定义或函数方法
  • 原文地址:https://www.cnblogs.com/SkyFireITDIY/p/4374934.html
Copyright © 2020-2023  润新知