为什么“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.cppb.cpp 。 链接是由编译器看到的第一个声明确定的,所以后面的a.cpp定义将具有正确的(外部)链接。

或者,您可以在定义中强制链接:

 extern int const n = 8; 

尽pipe是extern ,这仍然是一个定义。 任何具有类定义之外的初始化方法都是一个定义。

const C ++中的constconstexprvariables没有声明为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定义的有效命名空间。