为什么"extern const int n;" 不按预期工作?

xml*_*lmx 27 c++ const declaration extern

我的项目只包含两个源文件:

a.cpp:

const int n = 8;
Run Code Online (Sandbox Code Playgroud)

b.cpp:

extern const int n;

int main()
{
    // error LNK2001: unresolved external symbol "int const n" (?n@@3HB)
    int m = n; 
}
Run Code Online (Sandbox Code Playgroud)

我知道有几种方法可以使它工作; 但是,我只是想知道为什么它不起作用?

Jam*_*nze 50

这是因为const默认情况下意味着内部链接,因此您的"定义"在其出现的翻译单元之外是不可见的.

在这种情况下,到目前为止,最好的解决方案是将declaration(extern int const n;)放在头文件中,并将其包含在a.cppb.cpp.链接由编译器看到的第一个声明确定,因此后面的定义 a.cpp将具有正确的(外部)链接.

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

extern int const n = 8;
Run Code Online (Sandbox Code Playgroud)

尽管如此extern,这仍然是一个定义; 在类定义之外使用初始化程序的任何东西都是定义.


APr*_*mer 6

constconstexpr在C变量++具有内部链接(因此不是在其它编译单元可访问的),如果他们不也宣告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; 
}
Run Code Online (Sandbox Code Playgroud)

如果你不这样做

// a.cpp
extern const int n = 8;
Run Code Online (Sandbox Code Playgroud)

也是可能的