这种特殊情况下的extern const

时间:2018-07-20 02:57:17

标签: c++ extern

在C ++中使用externconst还有其他问题。我还阅读了有关内部和外部链接的信息(自从我使用C ++已经有一段时间了),但是如果有人提醒我有关以下特定情况的用法,我将不胜感激。

我有两个cpp文件:Description.cpp和Register.cpp,还有一个hpp文件:Description。 h。它们是这样的

//Description.cpp
#include "Description.hpp"
extern const FD models[];
//some other code

//Register.cpp
#include "Description.hpp"
extern const FD models[2]={
                           {"elementA",{1,2}},
                           {"elementB",{3,4}}
                          };

//Description.hpp
struct FD{
  string name;
  double v[2];
};

我想知道为什么Register.cpp中需要extern关键字

1 个答案:

答案 0 :(得分:2)

如注释中所讨论,默认情况下,const对象具有internal linkage,这意味着您只能从定义它的文件中看到它。要更改它,请使用关键字{{ 1}},表示“可以从其他文件中看到此变量”。因此,在extern中,您需要Register.cpp来告诉链接器使其在其他位置可见,在extern中,您需要Description.cpp来告诉编译器它可能在其他位置定义。

更好的解决方案是将声明extern移到extern const FD models[];文件(.hpp或新的Description.hpp中,具体取决于项目的详细信息)。然后在Register.hpp和使用Description.cpp的任何其他代码中,您包括该文件,根本不需要声明。在models中,您还包含此标头。然后,编译器知道Register.cpp具有外部链接,您无需再说models