2016-05-13 65 views
0

我得到了三個文件,其中一個具有要訪問的變量,另外兩個需要訪問這些變量。現在我有三個文件,像下面這樣,並且在編譯時遇到了未定義的i引用錯誤。我不明白爲什麼使用命名空間給出錯誤?如何從包含的頭文件訪問變量

header.h

extern int i; 

a.cpp

#include "header.h" 
#include "mheader.h" 
namespace s{ 
    int i=10; 
    struct p{ 
    p(){ 

    } 
    }; 
} 

b.cpp

#include "a.cpp" 
int main(){ 
    cout<<i; 
} 

即使我定義開始命名空間聲明它不是之前定義的變量i在命名空間內可訪問。有沒有一種方法可以在命名空間和b中訪問變量?

+3

'i'和's :: i'不是一回事,它們是無關緊要的。 – songyuanyao

+0

即使我在開始命名空間聲明之前定義它,它在名稱空間內也是不可訪問的。有沒有一種方法可以在命名空間和b中訪問變量? –

+0

你爲什麼'包括'一個CPP文件? – Ajay

回答

1

你可以這樣修復它。

header.h

namespace s 
{  
extern int i; 
} 

b.cpp

#include "a.cpp" 
    int main() 
    { 
     cout<<s::i; 
    } 

但你更好地理解它做好!

+0

是的,即使我不使用關鍵字extern,它也能正常工作。但萬一,如果你可以解釋爲什麼代碼不起作用。我很好奇如何在事情真的很糟糕的情況下工作,例如,如果我有迫切需要製作其他頭文件,該頭文件可以處理大型項目的多個變量,並且該項目可以在該項目的多個文件中使用 –

+2

考慮一下:你在'C:\ abc \ file.txt'中放置了一個文件,但是你正在嘗試讀取文件,就像'c:\ file.txt'一樣。考慮'extern'作爲文件'c:\ file.txt'的快捷方式,它不存在。 – Ajay

2

命名空間是名稱的單獨空間。除非另有指定,否則一個名稱空間中的名稱是指與另一個名稱空間中的名稱完全不同的變量(或類型或其他)。

extern int i在全局命名空間中聲明(全名是::i)比命名空間s定義int i不同的變量(全名是s::i)。

因此,你從來沒有定義::i您在header.h聲明和b.cpp使用

有兩種可能的解決方案,這取決於你有什麼打算。您可以在a.cpp或b.cpp的全局命名空間中定義int i。在這種情況下,您可能想要擺脫s::i這顯然不在任何地方使用。

或者,您可以在b.cpp中使用s::i。在這種情況下,您可能希望擺脫::i的聲明,該聲明不再在任何地方使用。

作爲旁註,包括a.cpp很可能是一個錯誤。如果您嘗試將從a.cpp和b.cpp編譯的目標文件鏈接在一起,那麼您將違反一個定義規則。