当我们需要使用别的模块声明的变量时,常常使用到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访问&#x