![]() |
#2
孤魂居士2007-11-21 12:36
为什么在C中经常用的是#DEFINE而不是CONST?而在C++中用CONST而不用#define? C里也可以用const,可能是习惯问题。 尽量用const和inline而不用#define 这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句: #define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO不是在你自己写的头文件中定义的,你就会奇怪1.653是从哪里来的,甚至会花时间跟踪下去。这个问题也会出现在符号调试器中,因为同样地,你所写的符号名不会出现在符号列表中。 const double ASPECT_RATIO = 1.653; 这种方法很有效。但有两个特殊情况要注意。 const char * const authorName = "Scott Meyers"; 关于const的含义和用法,特别是和指针相关联的问题,参见条款21。 另外,定义某个类(class)的常量一般也很方便,只有一点点不同。要把常量限制在类中,首先要使它成为类的成员;为了保证常量最多只有一份拷贝,还要把它定义为静态成员: class GamePlayer { 还有一点,正如你看到的,上面的语句是NUM_TURNS的声明,而不是定义,所以你还必须在类的实现代码文件中定义类的静态成员: const int GamePlayer::NUM_TURNS; // mandatory definition; 你不必过于担心这种小事。如果你忘了定义,链接器会提醒你。 旧一点的编译器会不接受这种语法,因为它认为类的静态成员在声明时定义初始值是非法的;而且,类内只允许初始化整数类型(如:int, bool, char 等),还只能是常量。
大多数情况下你只要做这么多。唯一例外的是当你的类在编译时需要用到这个类的常量的情况,例如上面GamePlayer::scores数组的声明(编译过程中编译器一定要知道数组的大小)。所以,为了弥补那些(不正确地)禁止类内进行整型类常量初始化的编译器的不足,可以采用称之为“借用enum”的方法来解决。这种技术很好地利用了当需要int类型时可以使用枚举类型的原则,所以GamePlayer也可以象这样来定义:
除非你正在用老的编译器(即写于1995年之前),你不必借用enum。当然,知道有这种方法还是值得的,因为这种可以追溯到很久以前的时代的代码可是不常见的哟。 回到预处理的话题上来。另一个普遍的#define指令的用法是用它来实现那些看起来象函数而又不会导致函数调用的宏。典型的例子是计算两个对象的最大值:
这个语句有很多缺陷,光想想都让人头疼,甚至比在高峰时间到高速公路去开车还让人痛苦。 int a = 5, b = 0; 这种情况下,max内部发生些什么取决于它比较的是什么值!
这个模板产生了一整套函数,每个函数拿两个可以转换成同种类型的对象进行比较然后返回较大的(常量)对象的引用。因为不知道T的类型,返回时传递引用可以提高效率(见条款22)。 顺便说一句,在你打算用模板写象max这样有用的通用函数时,先检查一下标准库(见条款49),看看他们是不是已经存在。比如说上面说的max,你会惊喜地发现你可以后人乘凉:max是C++标准库的一部分。 --------------------------------------------------------------- 楼上的真强!如果是c的化,我也有个建议:实用define命名简单内建类型的常量,const定义要依赖其他常量的对象;如: --------------------------------------------------------------- const较安全 C语言第二版 不支持 const 关键字,99版才支持。 gcc 早就支持 const。 为什么不用const 代替 #define 因为很多c语言编译器不支持 const和inline,如果想做可以移植的程序 虽然 C的const是受C++的影响加入的 C里用#define多而不是const是历史原因(编译器支持、库支持等)。现在有了const,一般地应该使用const而不是#define。另一个可以选择的是enum。 另外const是修饰符,不只支持常量声明,还可以修饰类型、函数等,用处多多。 当然某些宏定义(只要是有些带参数的宏)是没有办法用const来取代 |
#define不如const 请高手给我具体讲讲#define的不安全性