c++中, const变量默认仅在当前文件内有效

以前从来没有注意到的一个知识点: const 修饰的对象默认只有当前文件中有效。这就表明了:

  1. 在不同的.cpp文件内可以定义相同名称的const 对象。
  2. 如果要使const 我修饰的变量具有全局使用域,在定义该变量时,需要加上extern 关键字。

定义const变量时,不使用extern的情况:

在1.cpp文件中,定义如下:

const int a = 100;

在2.cpp文件中,定义如下:

extern const int a;
int main() {
	cout << a << endl;
	return 0;
}

我们进行编译, 会报链接错误,原因是:在2.cpp文件找不到变量a的定义。
c++中, const变量默认仅在当前文件内有效

定义const 变量时, 使用extern 关键字的情况:

在1.cpp文件中,定义如下:

extern const int a = 100;

在2.cpp文件中,定义如下:

extern const int a;
int main() {
	cout << a << endl;
	return 0;
}

编译正常,代码运行正常:

c++中, const变量默认仅在当前文件内有效

进一步分析原因

我猜测当定义一个const变量时,使用与不使用extern关键字时,生成的变量的符号不相同。下面进行验证。

  • 第一步:新建一个1.cpp文件,定义如下:

    const int value1 = 100;
    extern const int value2 = 100;
    int value3 = 100;
    extern int value4 = 100;
    
  • 第二步, 编译成.o文件。(报了一个编译警告,不管它)

c++中, const变量默认仅在当前文件内有效

  • 第三步:使用readelf工具看一下.o文件的符号表

c++中, const变量默认仅在当前文件内有效

我们看到:当定义一个const变量时,如果不使用extern 关键字进行修饰,默认生成的变量的符号为local 属性,而使用extern 关键字时,生成的符号为global属性。 对应local属性的符号,在链接的时候是找不到的。所以,const 对象默认只在文件内有效。

上一篇:mac上安装webpack报错解决方法Hit error EACCES: permission denied, mkdir '/usr/local/lib/node_modules/webpack


下一篇:JS---作用域和作用域链