2011-10-19 80 views
1

有人能告訴我什麼是關於命名空間

using namespace android; 
    .... 

namespace android { 
    .... 
} 

的區別???

因爲我發現Android源代碼中的幾乎所有cpp文件都使用第二個,因特網上的人們說它是一種名稱空間使用,但我不知道它是否正確和真正的區別。

另外,如果我想包括一些使用第二個類型的文件在我自己的項目中,我是否也需要使用命名空間android {...}?因爲如果我不這樣做,當我調用包含文件的方法時,編譯器會報告錯誤!或者如果我需要在方法調用之前添加任何前綴?

任何建議,將不勝感激。非常感謝。

+2

你需要了解C++的命名空間是如何工作的,他們是爲了什麼。 –

+0

對不起,我是C++的新手,我只知道「using namespace xxx」。感謝您的評論,我會更多地研究它。謝謝。 –

+1

:-)酷Bohan Lu - 所有的使用開始於某處 - 我的建議是儘可能地學習,並提出一個非常具體的問題。另外iammilind寫了一個很好的答案 –

回答

5
namespace android { 
    extern int i; // declare here but define somewhere 
    void foo(); 
} 

用於確定特定名稱內的變量和函數。如果要聲明這些變量/函數,則必須使用範圍解析運算符::。例如,

int main() 
{ 
    android::foo(); 
} 

此外,還有用於將所有namespace內容在一個單一的機構的實例沒有限制。您可以將namespace android正文分佈在多個文件中。例如

// x.cpp 
namespace android { 
    void somefunc_1(); 
} 
// y.cpp 
namespace android { 
    void somefunc_w(); 
} 

現在,有時候,你可能會發現使用::操作不方便所有的時間和不必要再製造的名稱。當時可以使用using namespace功能。這可以在函數範圍/名稱空間範圍/全局範圍(在class範圍內不允許)中聲明。

int main() 
{ 
    using namespace android; 
    foo(); // ok 
} 
void bar() 
{ 
    foo(); // error! 'foo' is not visible; must access as 'android::foo()' 
} 

假如你提到/宣稱using namespace android;全球(以上main()),那麼,你可以訪問foo()因爲它是在Bar()也。

+0

謝謝,iammilind。我對C++非常陌生,感謝您的友好和詳細的解釋。我會更多地研究它,再次感謝。 –

2

如果您對Java更有經驗,我的答案可能只會有幫助。我猜是因爲你在做Android的東西,這是事實。

以下表示您正在名稱空間android中聲明名爲MyClass的類。該課程的合格名稱將是android::MyClass

namespace android { 
    class MyClass {...}; 
} 

它可以被認爲是類似於Java代碼:

package android; 

public class MyClass {...} 

以下方法,你可以使用類,函數等在android命名空間中定義,而不必使用其合格的域名(假設他們已被包括在內)。

using namespace android; 

#include <path/to/MyClass.h> 
using namespace android; 

可以被認爲是類似於Java代碼:

import android.MyClass; 
+0

謝謝你,加里。是的,我正在做Android的東西。我只是熟悉C和Java而不是C++。感謝您的解釋,所以我現在瞭解其中的差異。謝謝。 –