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

时间:2013-02-15 12:24:32

标签: c++ const declaration extern

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

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

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

5 个答案:

答案 0 :(得分:49)

这是因为const默认意味着内部链接,所以 您的“定义”在翻译单元之外是不可见的 它出现的地方。

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

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

extern int const n = 8;

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

答案 1 :(得分:6)

C ++中的

constconstexpr变量具有内部链接(因此在其他编译单元中无法访问),如果它们也未被声明为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定义的有效命名空间。