我的项目仅由两个源文件:
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;
}
我知道有几个方法,使其工作; 不过,我只是想知道为什么但这并没有工作?
我的项目仅由两个源文件:
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
意味着默认内部连接,所以你的“定义”是不是哪里它出现在翻译单元的外部可见。
在这种情况下,迄今为止最好的解决办法是把声明( extern int const n;
在头文件中,并包括在两个a.cpp
和b.cpp
。 联动是由第一个声明编译器看到的决定,所以在后来的定义a.cpp
将有正确的(外部)联动。
或者,你可以强制在定义联动:
extern int const n = 8;
尽管extern
,这仍是一个定义; 一类定义之外的任何初始化是一个定义。
const
和constexpr
在C变量++具有内部链接(因此不是在其它编译单元可访问的),如果他们不也宣告extern
(无论是在定义或在先前声明)。
在C,它是不是这样的(C井没有constexpr
),所以你的代码是有效的,而且更可以放extern
上的定义。
所以,如果你想编写代码这既是C和C ++(和两个声明也许应该来自同一头詹姆斯指出):
// 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;
也有可能
的extern声明它a.cpp并没有在的extern只是b.cpp使用:
啊
extern const int n ;
a.cpp
#include "a.h"
...
const int n= 8
b.cpp:
#include "a.h"
...
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
的定义。