2016-11-22 73 views
0

代碼編譯沒有錯誤,我想知道什麼是不同的聲明外部函數內部和外部命名空間?調用外部函數而不指定命名空間

--a.h--

namespace mynamespace { 
    extern void foo(); 
} 

--a.c--

namespace mynamespace { 
    void foo(){ 
     dosomething; 
    }; 
} 

有沒有我應該擔心沒有 指定命名空間調用foo()時,任何關注?

#include "a.h" 
int main(int argc char *argv) 
    foo() 
} 

代替

#include "a.h" 
int main(int argc char *argv) 
    mynamespace::foo(); 
} 
+3

*「在沒有指定命名空間的情況下調用foo()時,我是否應該擔心?」*嘗試一下,你會發現很快。編譯器會告訴你它對你的代碼的看法。 –

+0

@IgorTandetnik奇怪的是,我的編譯器沒有顯示任何警告或錯誤,我在debain上使用gcc-4.9。 –

+0

如圖所示,包含'main'的翻譯單元[無法編譯](http://rextester.com/UQO84160)。如果是這樣,那麼你要麼在全局命名空間中提供'foo'的聲明,要麼在你的代碼中沒有顯示的地方使用'namespace mynamespace'或'using mynamespace :: foo'。 –

回答

0

事實證明,using namespace mynamespace;在其他頭文件中已經聲明。所以如果一個文件包含已經定義了using namespace mynamespace;的頭文件,那麼當前的頭文件也會受到影響。