代码之家  ›  专栏  ›  技术社区  ›  PeterK

嵌套名称空间,纠正静态库设计问题

  •  1
  • PeterK  · 技术社区  · 14 年前

    我目前正在开发一个相当大的静态库,它完成后将被一些工具使用。现在由于这个项目比我目前参与的任何项目都要大,我意识到是时候为这个项目考虑一个好的结构了。使用名称空间是其中一个逻辑步骤。

    我目前的方法是将库划分为多个部分(这些部分不是独立的,但它们的目的需要这样的分离)。我有一个“核心”部分,它现在只保存一些非常常见的typedef和常量(由库的许多不同部分使用)。其他部分是例如一些“util”(散列等)、文件i/o等等。每个部分都有自己的名称空间。我几乎完成了“utils”部分,意识到我的方法可能不是最好的。问题是(如果我们想这样称呼它的话)在“utils”名称空间中,我需要来自“core”名称空间的一些东西,这会导致包含核心头文件和许多using指令。

    叹息 )-这就是为什么良好的结构如此重要)

    2 回复  |  直到 14 年前
        1
  •  1
  •   rubenvb    14 年前

    core.h 头,你会有这样的东西

    #include <string>
    #include <iostream>
    namespace core
    {
        typedef std::string mystring;
        #define mycout std::cout
    }
    

    一个也没有 using utils.h header,你可以使用这样的东西:

    #include "core.h"
    namespace utils
    {
        core::mystring stringfunction(core::mystring &stuff)
        {
            core::mystring result;
            // do stuff
            return result;
        }
    }
    

    mystring 任何地方,除了核心::。它需要更多的类型,但名称空间就是这样,让你自己知道类型/函数/类是从哪里来的。

    更新

    故事的另一面是这样的:

    在核心名称空间中声明内容的头,如上所述。

    实用程序.h 在core::utils命名空间中声明内容的头,然后 namespace utils = core::utils 我的字符串 而不是 core::mystring utils*.h 标题和 *.cpp 文件夹。

    像这样的一段时间 :

    #include "core.h"
    namespace core
    {
        namespace utils
        {
            mystring stringfunction(mystring &stuff)
            {
                mystring result;
                // do stuff
                return result;
            }
        }
    }
    namespace utils = core::utils; // allow user to type utils::stringfunction
    

    这会稍微清理用户和库代码。

        2
  •  3
  •   anon anon    14 年前

    我自己的方法是为每个库使用一个名称空间。我不认为嵌套的名称空间会给聚会带来什么,除非你喜欢(在键盘上)打字。这对我来说没有任何问题。