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__等。

  • 相关阅读:
    POJ 2244 Eeny Meeny Moo (约瑟夫环问题)
    PHP中JavaScript使用的一个问题
    PHP和JavaScript跨域调用
    ExtJS中tree结合PHP的简单示例
    ExtJS中的Grid分页
    PHP、Smarty与jQuery Ajax 分页插件jquery.pager.js的使用
    jQuery版本不同及多次引用问题
    强大的Ext JS
    关于PHP中查询返回结果集和对象问题
    PHP中PDO方法fetch参数问题
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3511245.html
Copyright © 2011-2022 走看看