const与预处理宏#define的区别
在c语言程序设计时,预处理器可以不受限制地建立宏并用它来替代值。因为预处理器只做一些文本替换,宏没有类型检测概念,也没有类型检测功能。所以预处理器的值替换会出现一些小的问题,出现的这些问题,在c++中是通过const值来避免。
#define BUFSIZE 100
BUFSIZE是一个名字,并且它只存在预处期间,在编译和运行期间,是没有BUFSIZE,所有的BUFSIZE被100替换。因此BUFSIZE不占用存储空间,且能放在一个头文件里面,目的是为了使用BUFSIZE的所有编译单元提供一个值。
const int bufsize=100;
上述语句的bufsize, 首先是有类型的,而且上述语句的处理是在编译期间处理的,也就是const int bufsize=100; 这条语句是有编译器处理的,编译器会这条语句进行类型检测,并且如果是一个常量表达式,编译器还会执行常量折叠(在编译期间简单化常量表达式的一个过程,简单来说就是将常量表达式计算求值,并用求得的值来替换表达式带入常量)
const 和#define 一般都会放在头文件中,通过包含头文件,可把const定义单独放在一个地方并把它分配给一个编译单元。
c++中的const是默认内部链接的,通常c++编译器并不为const创建存储空间,相反它把这个定义保存在符号表里。但是extern以及取const得地址,会对const进行存储空间分配。