2

從C++編譯器的角度來看,命名空間只是一種名稱裝飾約定?我檢查了生成的程序集列表,發現除了標識符由命名空間的名稱裝飾以外,所有內容看起來都一樣。C++編譯器實現命名空間

+4

還有什麼辦法? :)畢竟,它是*名字* -space。 – Xion 2011-06-09 10:03:27

+1

是的。問題是什麼? – Christopher 2011-06-09 10:03:58

回答

2

正如你指出的,名字改編的故事(但理由這樣做有更多的是有接頭,而不是編譯器)的一部分。

但是,就編譯器中的名稱空間處理而言,名稱修改遠非全部。除此之外,編譯器必須能夠找出不合格的名稱,這可能是不平凡的:請參閱argument-dependent lookup

0

從C++編譯器的角度來看,命名空間只是一種名稱裝飾約定嗎?

我想是的。它只是最後的名字裝飾。

爲了做到這一點,編譯器做了很多事情。它在解析名稱時選擇正確的名稱空間(可能超出許多名稱空間)。

例如,

namespace X 
{ 
    void f(); //compiler chooses X only when decorating f() 
    namespace Y 
    { 
     void f(); //compiler chooses X and Y when decorating f() 
     void g() //compiler chooses X and Y when decorating g() 
     { 
      f(); //which f? Compiler decorates it with both X and Y. 
      X::f(); //which f? Compiler decorates it with X only. 
     } 
    } 
} 
+0

命名空間是否有某種範圍?你可能有兩個同名的類,但是這個名字空間可以防止碰撞。 – rcapote 2011-06-09 10:06:15

0

Bjarne Stroustrup編寫的第一個C++編譯器被稱爲CFront並非巧合。它將C++代碼轉換爲C並將其提供給C編譯器。所以,我認爲它只是名字改編爲超載&避免名稱衝突(命名空間)創建獨特的符號

+0

CFront沒有名稱空間。 – 2011-06-09 10:37:08

+1

@neil:我同意但是這個概念在那裏是作爲具有相同命名函數的類,因此它們需要命名修改,因爲C需要唯一的函數名。 – hackworks 2011-06-09 10:44:38