c++ - tutorial - 命名空間




有沒有更好的方法在頭文件中表達C++中的嵌套命名空間 (6)

我從C ++切換到Java和C#,並認為名稱空間/包的使用在那裡更好(結構良好)。 然後我回到C ++並試圖以相同的方式使用命名空間,但在頭文件中所需的語法是可怕的。

namespace MyCompany
{
    namespace MyModule
    {
        namespace MyModulePart //e.g. Input
        {
            namespace MySubModulePart
            {
                namespace ...
                {
                    public class MyClass    

以下內容對我來說也很奇怪(避免深度縮進):

namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
     public class MyClass
     {

是否有更短的方式來表達上述事情? 我錯過了類似的東西

namespace MyCompany::MyModule::MyModulePart::...
{
   public class MyClass

更新

好吧,有人說Java / C#和C ++中的使用概念是不同的。 真? 我認為(動態)類加載不是命名空間的唯一目的(這是一個非常技術性的推理視角)。 為什麼我不應該將它用於可讀性和結構化,例如考慮“IntelliSense”。

目前,命名空間與您可以在其中找到的內容之間沒有邏輯/粘合劑。 Java和C#做得更好......為什麼要包含<iostream>並擁有命名空間std ? 好吧,如果你說邏輯應該依賴於頭部來包含,為什麼#include不使用像#include <std::io::stream><std/io/stream>這樣的“IntelliSense”友好語法? 我認為與Java / C#相比,缺省庫中缺少的結構化是C ++的一個弱點。

如果狂熱衝突的唯一性是一個Point(這也是C#和Java的一個點),一個好主意是使用項目名稱或公司名稱作為名稱空間,你不這麼認為嗎?

一方面它說C ++是最靈活的...但每個人都說“不要這樣做”? 在我看來,C ++可以做很多事情,但是在很多情況下,與C#相比,即使是最簡單的事情也會有可怕的語法。

更新2

大多數用戶表示創建比兩個級別更深的嵌套是無稽之談。 好吧,那麼Win8開發中的Windows :: UI :: Xaml和Windows :: UI :: Xaml :: Controls :: Primitives名稱空間呢? 我認為微軟對命名空間的使用是有道理的,它確實比僅僅2個層次更深。 我認為更大的庫/項目需要更深層次的嵌套(我討厭像ExtraLongClassNameBecauseEveryThingIsInTheSameNameSpace這樣的類名...那麼你也可以將所有東西放到全局命名空間中。)

更新3 - 結論

大多數人說“不要這樣做”,但是......甚至提升還有一個或兩個級別更深的嵌套。 是的,它是一個庫,但是:如果你想要可重複使用的代碼 - 將你自己的代碼視為一個庫你會給別人。 我還使用更深層次的嵌套來使用命名空間進行發現。



C ++名稱空間用於分組接口,而不是分割組件或表達政治分裂。

該標準禁止使用類似Java的命名空間。 例如, 命名空間別名提供了一種輕鬆使用深層嵌套或長命名空間名稱的方法。

namespace a {
namespace b {
namespace c {}
}
}

namespace nsc = a::b::c;

但是namespace nsc {}將是一個錯誤,因為命名空間只能使用其原始命名空間名稱來定義。 基本上,標準使得這樣的庫的用戶容易,但實施者很難。 這會阻止人們寫這些東西,但如果他們這樣做,就會減輕影響。

每個接口應該有一個命名空間,由一組相關的類和函數定義。 內部或可選的子接口可能會進入嵌套的命名空間。 但是兩個以上的深度應該是一個非常嚴重的危險信號。

考慮使用下劃線字符和標識符前綴,其中不需要::運算符。


兩個標準(C ++ 2003和C ++ 11)都非常明確,命名空間的名稱是標識符。 這意味著需要顯式嵌套標頭。

我的印像是,除了名稱空間的簡單名稱之外,允許放置限定標識符並不是一件大事,但由於某種原因,這是不允許的。


您可以使用以下語法:

namespace MyCompany {
  namespace MyModule {
    namespace MyModulePart //e.g. Input {
      namespace MySubModulePart {
        namespace ... {
          class MyClass;
        }
      }
    }
  }
}

// Here is where the magic happens
class MyCompany::MyModule::MyModulePart::MySubModulePart::MyYouGetTheIdeaModule::MyClass {
    ...
};

請注意,即使在C ++ 98中,此語法也是有效的,它幾乎與使用嵌套命名空間定義的 C ++ 17中現有的語法類似。

快樂取消!

資料來源:


是的,你必須這樣做

namespace A{ 
namespace B{
namespace C{} 
} 
}

但是,您嘗試以不應該使用的方式使用命名空間。 檢查this問題,也許你會發現它很有用。


為了避免真正的深度縮進,我通常這樣做:

namespace A { namespace B { namespace C
{
    class X
    {
        // ...
    };
}}}




namespaces