Skip to content

Commit

Permalink
Update namespaces
Browse files Browse the repository at this point in the history
  • Loading branch information
welkineins committed Feb 1, 2016
1 parent e0bade6 commit 0934789
Showing 1 changed file with 12 additions and 10 deletions.
22 changes: 12 additions & 10 deletions google-cpp-styleguide/scoping.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,22 @@

.. _namespaces:

2.1. 命名空間
2.1. 命名空間 (Namespaces)
~~~~~~~~~~~~~~~~~~~~~~~~

.. tip::

鼓勵在 ``.cc`` 文件內使用匿名命名空間. 使用具名的名字空間時, 其名稱可基於專案名或相對路徑. 禁止使用 using 指示(using-directive)。禁止使用內聯命名空間(inline namespace)。
除了少數的例外,都建議使用把程式碼放在命名空間內。一個具名的命名空間應該擁有唯一的名字,其名稱可基於專案名稱,甚至是相對路徑。而在 ``.cc`` 文件內,使用匿名的命名空間是推薦的,但禁止使用 using 指示(using-directives)和內聯命名空間(inline namespaces)。

定義:

命名空間將全局作用域細分為獨立的, 具名的作用域, 可有效防止全局作用域的命名衝突.
命名空間將全域作用域細分為獨立的,具名的作用域可有效防止全域作用域的命名衝突。

優點:

雖然類已經提供了(可嵌套的)命名軸線 (YuleFox 注: 將命名分割在不同類的作用域內), 命名空間在這基礎上又封裝了一層.
命名空間可以在大型專案內避免名稱衝突,同時又可以讓多數的程式碼有合理簡短的名稱。

舉例來說, 兩個不同專案的全局作用域都有一個類 ``Foo``, 這樣在編譯或運行時造成衝突. 如果每個專案將程式碼置於不同命名空間中, ``project1::Foo`` 和 ``project2::Foo`` 作為不同符號自然不會衝突.
舉例來說, 兩個不同專案的全域作用域都有一個類別 ``Foo``,這樣在編譯或運行時期會造成衝突。如果每個專案將程式碼置於不同命名空間中``project1::Foo`` 和 ``project2::Foo`` 在專案中就可以被視為不同的 symbols 而不會發生衝突。兩個類別在各自的命名空間中,也可以繼續使用 ``Foo`` 而不需要前綴命名空間。

內聯命名空間會自動把內部的標識符放到外層作用域,比如:

Expand All @@ -30,19 +30,21 @@
}
}

``X::Y::foo()`` 與 ``X::foo()`` 彼此可代替。內聯命名空間主要用來保持跨版本的 ABI 兼容性
``X::Y::foo()`` 與 ``X::foo()`` 彼此可以互換使用。內聯命名空間主要用來保持跨版本的 ABI 相容性

缺點:

命名空間具有迷惑性, 因為它們和類一樣提供了額外的 (可嵌套的) 命名軸線.
命名空間可能造成疑惑,因為它增加了識別一個名稱所代表的意涵的難度。例如: ``Foo`` 是命名空間或是一個類別。

命名空間很容易令人迷惑,畢竟它們不再受其宣告所在命名空間的限制。內聯命名空間只在大型版本控制裡有用
內聯命名空間更是容易令人疑惑,因為它並不完全符合命名空間的定義;內聯命名空間只在大型版本控制裡會被使用到

在標頭檔中使用匿名空間導致違背 C++ 的唯一定義原則 (One Definition Rule (ODR)).
在標頭檔中使用匿名命名空間容易導致違背 C++ 的唯一定義原則 (One Definition Rule (ODR))。

在某些狀況中,經常會需要重複的使用完整 (fully-qualified) 的名稱來參考某些 symbols。對於多層巢狀的命名空間,這會增加許多混亂。

結論:

根據下文將要提到的策略合理使用命名空間.
根據下文將要提到的策略合理使用命名空間。記得在命名空間的結尾使用註解進行標示,例如下一節的範例程式一樣。

2.1.1. 匿名命名空間
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down

0 comments on commit 0934789

Please sign in to comment.