2013-02-15 97 views
22

我的項目僅由兩個源文件:爲什麼「extern const int n;」不按預期工作?

a.cpp:

const int n = 8; 

b.cpp:

extern const int n; 

int main() 
{ 
    // error LNK2001: unresolved external symbol "int const n" ([email protected]@3HB) 
    int m = n; 
} 

我知道有幾個方法,使其工作;然而,我只是想知道爲什麼它不起作用?

+7

嘗試將'a.cpp'改爲'extern const int n = 8;'AFAIK'const'意味着'static',儘管我不太清楚。 – Pubby 2013-02-15 12:26:22

+0

a.cpp是否需要使用extern關鍵字查看n的decleration? – 2013-02-15 12:28:43

+0

你沒告訴我們你的鏈接和如何... – PlasmaHH 2013-02-15 12:28:58

回答

39

這是因爲const默認意味着內部鏈接,因此 您的「定義」在其出現的翻譯單元 之外不可見。

在這種情況下,迄今爲止最好的解決辦法是把聲明 (extern int const n;)在頭文件中,幷包括在兩個 和a.cppb.cpp。鏈接由編譯器看到的第一個聲明確定,因此 a.cpp中的後面定義將具有正確的(外部)鏈接。

或者,也可以促使聯動的定義:

extern int const n = 8; 

儘管extern,這仍是一個定義;任何具有 類別定義之外的初始化程序都是定義。用C

2

在a.cpp的extern聲明並沒有在的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; 
} 
+0

嗯,用來做一個頭文件。用extern包含頭文件是最簡單的方法。 – Gjordis 2013-02-15 12:33:21

+1

實際上,你應該從b.cpp中刪除*'const int n;'。包括的頭是什麼需要。 – Roddy 2013-02-15 12:39:46

+0

@Roddy正確,相應修改。 – Gjordis 2013-02-15 12:41:38

5

constconstexpr變量++具有內部鏈接(因此不是在其它編譯單元可訪問的),如果他們不也宣告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; 

也可以

+0

@Roddy,固定。不要猶豫,自己修理這樣的事情,而不是評論。 – AProgrammer 2013-02-15 12:47:50

1

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關鍵字即可。你已經在申報了。

1

如果這裏其他的答案不這樣做的伎倆,這可能是因爲您在不同的命名空間的定義......如果編譯通過的情況下,你會得到一個undefined symbol連接錯誤:

  • 檢查未定義符號的名稱空間;這是extern const int n聲明的有效命名空間。
  • 確保這是您製作const int n = 8定義的有效命名空間。