C++ Primer const变量

本文深入解析了C++ Primer第5版中关于const修饰的变量作用范围、extern关键字在不同文件间共享const变量的用法,并详细解释了typedef在const情况下的使用误区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值