C++语言程序设计

上面两行的效果是一样的，都是将标识符PI定义为3.14159265。但是，这两种定义符号常量的方法还是有区别的：
（1）const产生的符号是具有类型的，在
const double PI=3.14159265;
中，PI是一个double型的常量，而#define命令定义的符号则不具有类型，它仅仅被另一个字符串替换，而不管内容是否正确。例如：
#define PI 3.14159,265
这样的简单宏定义在预编译的时候不会产生错误，因为系统仅仅将后面的"3.14159,265"视为一个字符串而不是double型的常量。但是，如果把它作为一个double型的常量，参与表达式的运算，则会出现编译错误，例如：
double r = 10.0;
double d = PI*r*r;
后一个语句经宏替换后，则变为：
double d = 3.14159,265*r*r;
显然是不对的。
（2）const可以定义一个局部常量，在某一个函数体内用const定义的常量是局部常量，其作用域仅限于该函数体。而用#define定义的常量则不一样，即使在某个函数体内，但它的作用域并不仅限于该函数体，而是从定义点开始，直到整个文件结束为止，除非在此过程中使用#undef取消其定义。
（3）使用const定义常量是一个说明语句，以分号结束；而用#define定义常量是一个预处理命令，不能用分号结束。
在C++中，我们一般用const定义符号常量。很显然，用const定义常量比用define定义常量更好。
在使用宏定义时应注意的是：
（a） 在书写#define 命令时，注意<宏名>和<字符串>之间用空格分开，而不是用等号连接。
（b） 使用#define定义的标识符不是变量，它只用作宏替换，因此不占有内存。
（c） 习惯上用大写字母表示<宏名>，这只是一种习惯的约定，其目的是为了与变量名区分，因为变量名通常用小写字母。
如果某一个标识符被定义为宏名后，在取消该宏定义之前，不允许重新对它进行宏定义。取消宏定义使用如下命令：
#undef<标识符>
其中，undef是关键字。该命令的功能是取消对<标识符>已有的宏定义。被取消了宏定义的标识符，可以对它重新进行定义。
宏定义可以嵌套，已被定义的标识符可以用来定义新的标识符。例如：
#define PI 3.14159265
#define R 10
#define AREA (PI*R*R)