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.cpp
和b.cpp
.链接由编译器看到的第一个声明确定,因此后面的定义
a.cpp
将具有正确的(外部)链接.
或者,您可以在定义中强制链接:
extern int const n = 8;
Run Code Online (Sandbox Code Playgroud)
尽管如此extern
,这仍然是一个定义; 在类定义之外使用初始化程序的任何东西都是定义.
const
和constexpr
在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)
也是可能的