zoukankan      html  css  js  c++  java
  • 【02】尽量以const,enum,inline替换#define

    1、考虑为什么?

      首先,#define不是语言的一部分,而是预编译过程。也就是在编译器编译之前,进行文本替换。考虑#define Pi 3.1425;在编译之前,Pi都会被文本替换为3.1415,因此编译器看不到Pi这个标识。这会增加调试难度。同时文本替换导致目标码中出现多份3.1415。

    2、尽量不使用#define,就要使用替代办法。

    3、对于#define Pi 3.1415这样形式,使用const替换const double Pi = 3011415;以const替换#define,有两个特殊情况:

      a、定义常量指针,使用两个const,限制指向对象不能修改,指向不能修改;

      b、class专属常量,它表示的意义是把常量的作用域限制在class内,同时为了该常量只有一份实例,让所有对象共享,声明为static成员。在类中:static const int Max= 100;注意:这是一个声明,而不是定义。我们知道,C++要求对于使用的任何东西必须提供一个定义式,但是对于class专属常量,并且是static同时是整数性的情况,是个例外,也就是说,这种情况不需要定义,就可以使用。但是,如果要娶它的地址,还是要定义一下。

    4、旧式编译器可能不支持const-static-int的声明语法,因此必须定义。在类内部,数组必须编译时确定大小,需要使用这个值,怎么办?使用enum。需要说明,使用#define和enum,取它们的地址往往不合法。而取const对象是合法的。

    5、#define的另一个用法就是宏,宏表面上是方法,但没有方法调用的额外开销,因为它是文本替换。这往往会出现意想不到的Bug,应该使用inline替换。

    6、尽量使用#define的替代品,但并不能完全消除#define,有些地方还必须使用,比如:#ifndef,__LINE__等。

  • 相关阅读:
    emacs窗口切换神器--window-numbering
    yum命令总结
    Emacs快捷键设置
    emacs常用命令
    Emacs编辑远程服务器中的文件
    (转)emacs安装cedet和ecb
    (转)replace 和 on duplicate key update语句
    HashMap解决hash冲突的方法
    程序员的学习和积累
    HttpClient 设置代理方式
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3511245.html
Copyright © 2011-2022 走看看