码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-03-28 23:04:39      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

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替代

 

 

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

标签:

原文地址:http://www.cnblogs.com/SkyFireITDIY/p/4374934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!