为什么“extern const int n”不能按预期工作?
我的项目只包含两个源文件:
a.cpp:
const int n = 8;
b.cpp:
extern const int n; int main() { // error LNK2001: unresolved external symbol "int const n" (?n@@3HB) int m = n; }
我知道有几种方法可以使其工作。 但是,我只是想知道为什么它不起作用?
这是因为const
默认意味着内部链接,所以你的“定义”在它出现的翻译单元之外是不可见的。
在这种情况下,最好的解决scheme是将声明( extern int const n;
)放在头文件中,并将其包含在a.cpp
和b.cpp
。 链接是由编译器看到的第一个声明确定的,所以后面的a.cpp
定义将具有正确的(外部)链接。
或者,您可以在定义中强制链接:
extern int const n = 8;
尽pipe是extern
,这仍然是一个定义。 任何具有类定义之外的初始化方法都是一个定义。
const
C ++中的const
和constexpr
variables没有声明为extern
(在定义中或在先前的声明中),则它们具有内部链接(因此在其他编译单元中不可访问)。
在C中,情况并非如此(C没有constexpr
),所以你的代码是有效的,你可以把extern
放在一个定义上。
所以如果你想编写C和C ++的代码(这两个声明应该可能来自James指出的同一个头文件):
// a.cpp extern const int n; const int n = 8; // b.cpp extern const int n; int main() { int m = n; }
如果你不这样做
// a.cpp extern const int n = 8;
也是可能的
在a.cpp中声明它为extern,并在b.cpp中使用而不使用extern:
啊
extern const int n ;
a.cpp
#include "ah" ... const int n= 8
b.cpp:
#include "ah" ... int main() { int m = n; }
To share a const object among multiple files, you must define the variable as extern.
To define a single instance of a const variable, we use the keyword extern on both its definition and declaration(s):
从这些规则中,您只需要在定义中添加extern
关键字。 你已经在申报了。
如果其他答案在这里没有做到这一点,可能是你在不同的命名空间中定义了你的定义…如果编译通过,你会得到一个undefined symbol
链接器错误:
- 检查未定义符号的名称空间; 这是
extern const int n
声明的有效命名空间。 - 确保这是你的
const int n = 8
定义的有效命名空间。