2014-05-24 75 views
0

考慮下面的代碼:什麼外部連接意味着

#include <stdio.h> 

namespace EnclosingNmspc 
{ 
    namespace Nmspc 
    { 
     extern int a;//This a and the a defined above denote the same entity 
     int a=5; 
    } 
} 

extern int a; 

int main() 
{ 
    printf("%d\n",a); 
} 

有從3.5/2的報價:

當一個名稱具有外部連接,它表示實體可以是 稱爲以其他翻譯單位的名稱或來自同一翻譯單位的其他範圍的名稱。

我不明白爲什麼這個規則在我的情況下不起作用?我有undefined reference鏈接錯誤。

回答

0

您的問題已經回答there canonically

您一直想在不同的編譯單元中定義::a

int a=5;實際上在相同範圍內定義了extern int a;。但這不是用

printf("%d\n",a); 

在你的主程序中。要檢查您的命名空間中的東西嘗試

printf("%d\n",EnclosingNmspc::Nmspc::a); 
+0

但規格說,它是指_The實體可以通過名稱從其他翻譯單位的範圍unit'._ –

+0

簡稱或'從同翻譯的其他範圍@StAntario你仍然需要提供一個定義,編譯器不會自動爲你做。 –

+0

它要麼聲明'extern int a;',並在其他地方定義**或** define'int a;',並通過'extern'聲明從別處訪問它。如果你想從外部鏈接中隱藏'a',把它放在一個未命名的名稱空間中。 –