Effective-C-条款02尽量以constenuminline替换define

28次阅读

共计 691 个字符,预计需要花费 2 分钟才能阅读完成。

这个条款也可以改为“可以用编译器替换预处理器”,因为 #define 有很多的问题和不方便之处。

#define ASPEC 1.6454

当你使用了这个常量但获得一个编译错误信息时,可能会带来困惑,因为错误信息会提到 1.6454 而不会提到名称本身,尤其是这个量又别人或在另外一个头文件中定义就更麻烦了。
而改为 const double ASPEC = 1.6454 就不会出现这种情况。

当 const、指针结合在一起时应该注意‘*’与 const 的相对位置;
另一个要注意的问题是如果你想在 class 中设立这样一个作用域为这个类的变量,则让它成为一个 static 成员:

class G
{

static const int num = 5;
int sc[num];

};

然而,num 是常量的声明式而非定义式,通常 C ++ 要求你对你所使用的任何东西提供一个定义式。
但如果它是一个 class 专属常量又是 static,且为整数类型(integral type,例如 int,char,bool),则需特殊处理。
只要不取它们的地址,你可以声明并使用它们而无须提供定义式。
但如果你取某个 class 专属常量的地址,或纵使你不取其地址但是编译器却(不正确的)坚持要看到一个定义式,
你就必须另外提供定义式如下:

const int G::num;

·#define 是不提供任何封装的,也就是说没有 private #define 之类的东西,但是 const 可以。

另一个好用的东西是 enum hack. 像在类中加入下面的代码:

enum{Nun = 5};

用 Nun 作为 5 的一个代称,而且可以避免用指针来获取你的整数常量的地址,enum 可以完成这个约束。而且它很实用,经常会用到。

正文完
 0