【问题标题】:Namespaces in C++ header filesC++ 头文件中的命名空间
【发布时间】:2010-11-04 19:08:21
【问题描述】:

我喜欢 C++ 命名空间的概念,因为它们有助于保持源代码简洁,同时避免名称冲突。在 .cpp 文件中,使用“使用命名空间”声明时效果很好。但是,在头文件中不能使用它,因为它会“打开”名称空间,这意味着“使用名称空间”不仅适用于当前头文件,还适用于此后编译的所有内容。这部分抵消了命名空间的优势。例如,考虑一个头文件,其中经常使用“ourlib::networking::IpAddress”和“ourlib::filesystem::Path”类。

有没有办法限制头文件中“使用命名空间”声明的效果?

【问题讨论】:

    标签: c++


    【解决方案1】:

    可以把,最常用的类放在 ::ourlib 命名空间中,比如

    namespace ourlib {
       using networking::lpAddress;
    }
    

    因此,如果它们在项目中是独一无二的,那么您很可能不会遇到问题。所以在,任何 放置在标题中,您可以直接访问lpAddress 而无需放入 全局命名空间(我假设你所有的标题都在 namespace ourlib 中)

    【讨论】:

      【解决方案2】:

      不,不能这样做:(

      【讨论】:

        【解决方案3】:

        您可以只导入单个类:

        using ourlib::networking::lpAddress;
        

        至少如果我没记错的话;)

        不过,这可能仍会污染全局命名空间。我倾向于只使用头文件中的长名称空间前缀。这使得其他开发人员更容易阅读头文件(因为您不必查找哪个类来自哪个命名空间)。

        【讨论】:

        • > 这可能会污染全局命名空间
        • 取决于您所说的污染。在我看来,如果通过包含标头将单个类限制为实现文件,则可以很好地导入单个类。如果绝对必要,我通常只在其他标题中包含标题,并使用前向声明。不过,那是为了缩短编译时间。
        • 我忘了补充,除此之外,我同意你的看法。正如我所说,我主要使用完全限定名称。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        • 1970-01-01
        相关资源
        最近更新 更多