在C++中可以使用#define或者const来定义常量,但是使用const相比起#define有更多的优点。——–<Effective C++>
以下部分内容选自<程序猿面试宝典>
- const 常量有数据类型,而宏常量是没有数据类型。编译器可以对前者进行类型安全检查,而后者仅仅进行字符替换,没有类型安全检查,并且在字符替换过程中会产生一些意料不到的错误。(边际效应)
#define X 10
#define Y X+X
-》Y*Y //原意:20*20 实际上是 10+10*10+10
当然,这样的边际效应可以通过良好的编写宏习惯避免。
- 有些集成化调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在C++程序中一般只使用const常量而不是用#define。
既然const常量可以取代#define常量那么为什么有的库(程序)使用的#define常量
常量的引进是在早期的C++版本中,当时标准C规范正在制订。那时,常量被看做一个好的思想而被包含在C中。但是,C中的const的意思是”一个不能被改变的普通变量”。在C中,它总是占用内存,而且它的名字是全局符。C编译器不能把const看成一个编译期间的常量。在C中,如果写:
const bufsize=100;
char buf[bufsize];
尽管看起来好像做了一件合理的事,但这将得到一个错误的结果。因为bufsize占用内存的某个地方,所以C编译器不知道它在编译时的值。在C语言中可以选择这样书写:
extern const bufsize;//declaration only
这种方法也可用在C语言中。在C语言中使用限定符const不是很有用,即使是在常数表达式里(必须在编译期间被求出)想使用一个已命名的值,使用const也不是很有用的。C迫使程序员在预处理器里使用# define。