我的项目只包含两个源文件:
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;
}
我知道有几种方法可以使它发挥作用;但是,我只是想知道为什么它不起作用?
答案 0 :(得分:49)
这是因为const
默认意味着内部链接,所以
您的“定义”在翻译单元之外是不可见的
它出现的地方。
在这种情况下,到目前为止,最好的解决方案是声明
(extern int const n;
)在头文件中,并包含在
a.cpp
和b.cpp
。联系由决定
编译器看到的第一个声明,所以后面的定义
a.cpp
将具有正确的(外部)链接。
或者,您可以在定义中强制链接:
extern int const n = 8;
尽管extern
,这仍然是一个定义;任何事情
类定义之外的初始化程序是一个定义。
答案 1 :(得分:6)
const
和constexpr
变量具有内部链接(因此在其他编译单元中无法访问),如果它们也未被声明为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;
也是可能的
答案 2 :(得分:2)
在a.cpp中将其声明为extern,并在b.cpp中使用without extern:
A.H
extern const int n ;
a.cpp
#include "a.h"
...
const int n= 8
b.cpp:
#include "a.h"
...
int main()
{
int m = n;
}
答案 3 :(得分:2)
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
关键字即可。你已经在声明中了解它。
答案 4 :(得分:1)
如果这里的其他答案不起作用,可能是您在不同的命名空间中定义了...如果编译通过,并且您收到undefined symbol
链接器错误:
extern const int n
声明的有效命名空间。const int n = 8
定义的有效命名空间。