C++使用extern修饰const变量

当我们需要使用别的模块声明的变量时,常常使用到extern。比如下例。

假设b.cpp有变量:

// in b.cpp
int var_b = 2333;

在同一工程的a.cpp中想要使用var_b,可以如此声明:

// in a.cpp
extern int var_b;

当如果var_b是const变量呢?即是说b.cpp中var_b的声明是:

// in b.cpp
const int var_b = 2333;

此时a.cpp的声明也加上const:

// in a.cpp
extern const int var_b;

看起来没什么问题,但实际上链接失败,错误类似于:

error LNK2001: unresolved external symbol "int const var_b"

到底发生了什么?

在C++11中,当变量使用const修饰而又没有使用extern修饰,且此前没有被声明为external linkage时,它是internal linkage的,所以b.cpp中var_b是internal linkage的。

而internal linkage的变量不能被别的编译单元访问(源文件及其包含的头文件组成一个编译单元),所以b.cpp中的var_b无法被a.cpp访问,故此出现"unresolved external symbol"的链接错误。

解决方案就是在var_b的声明处加上extern,使其成为external linkage的变量,即将b.cpp的var_b声明改为:

// in b.cpp
extern const int var_b = 2333;

a.cpp:

// in a.cpp
extern const int var_b;

当然我们一般会在公共头文件中声明var_b,比如common.h:

// in common.h
extern const int var_b;

b.cpp:

// in b.cpp
#include "common.h"

const int var_b = 2333;

a.cpp:

#include "common.h"

这样a.cpp也可以正常使用var_b。

 


更多精彩内容,可关注微信公众号【CPP笔记】

你可能感兴趣的:(C++进阶,c++)