C++ Primer第5版 54页
默认情况下,const修饰的变量的作用域为本文件。原因是编译器要在编译过程中,将用到const变量的地方都替换为该变量初始化时对应的值,而由于cpp文件是单独编译(不含链接,单纯的编译过程)的,所以必须要在每一个用到该变量的文件中都有对它的定义。即使多个文件中出现了同名的const变量,实际上等同于在这些文件中分别定义了独立的变量。
然而,当const变量的初值不是常量表达式(比如,是某个函数的返回值),又确实希望将这个变量在不同文件中共享时(即一处定义,多处声明并使用),可以在所有const定义或声明的地方加上extern关键字。这样只需要定义一次就可以了。
例:
file_1.cpp
extern const int bufSize = fcn();
file_1.h
extern const int bufSize;
值得注意的是,在61页typedef的用法中,也出现了当有const的情况下易混淆的场景。
例:
const char *p; // p是一个指向常量字符的指针
const char **pp;// pp是一个指针,它的对象是一个指向常量字符的指针
这里要说明的是,const char是数据类型,而*或**是声明符的一部分。
当出现typedef时,便有些容易混淆。
例:
typedef char * pstring;
const pstring cstr = NULL; // cstr是指向char的常量指针
const pstring *ps ; // ps是一个指针,它的对象是指向char的常量指针
当声明语句中用到pstring时,其基本数据类型是指针。以上两行声明语句中,const pstring便成为了声明语句的基本数据类型。而*才是声明符,所以,cstr是const的,*ps是const的。
如果将pstring简单重写为char*后,则声明语句变为 const char * cstr,此时const char变成了基本数据类型, *cstr才具有const的属性。