为什么“外部const int的N;”无法按预期工作?(Why does “extern const

2019-07-19 23:02发布

我的项目仅由两个源文件:

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; 
}

我知道有几个方法,使其工作; 不过,我只是想知道为什么但这并没有工作?

Answer 1:

这是因为const意味着默认内部连接,所以你的“定义”是不是哪里它出现在翻译单元的外部可见。

在这种情况下,迄今为止最好的解决办法是把声明( extern int const n;在头文件中,并包括在两个a.cppb.cpp 。 联动是由第一个声明编译器看到的决定,所以在后来的定义a.cpp将有正确的(外部)联动。

或者,你可以强制在定义联动:

extern int const n = 8;

尽管extern ,这仍是一个定义; 一类定义之外的任何初始化是一个定义。



Answer 2:

constconstexpr在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;

也有可能



Answer 3:

的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; 
}


Answer 4:

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关键字在你的定义。 你已经拥有它的声明。



Answer 5:

如果这里的其他答案不这样做的伎俩,这可能是因为您在不同的命名空间的定义......如果编译通过的情况下,你会得到一个undefined symbol链接错误:

  • 检查未定义的符号的命名空间; 这对有效命名空间extern const int n声明。
  • 确保这就是你让你的有效的命名空间const int n = 8的定义。


文章来源: Why does “extern const int n;” not work as expected?