【问题标题】:Declaring using statement after namespace declaration在命名空间声明之后声明 using 语句
【发布时间】:2011-07-06 05:15:36
【问题描述】:

我正在编写一个由几个“包”组成的实用程序库。每个包中的类都包含在不同的命名空间中。我知道如何通过在类声明的末尾自动声明 using 语句来简化这种情况(见下文),这将避免程序员在 cpp 文件中执行此操作。

namespace Utility
{
    class String
    {
        // Class Implementation
    };
}

using Utility::String;

我的理解是,如果用户包含标题 String.h 并且 String 在 Utility 中,那么程序员会想要使用 String。显然,如果有外部类链包括一堆弄脏命名空间的文件,这可能会很糟糕,所以我想如何将其改为#define。

namespace Utility
{
    class String
    {
        // Class Implementation
    };
}

#ifdef AUTO_DECLARE_NAMESPACE
    using Utility::String;
#endif

这样,想要这种扩展功能的程序员就可以得到它。

这是个好主意还是我忽略了什么?

【问题讨论】:

    标签: c++ api namespaces api-design using-declaration


    【解决方案1】:

    难道你不能有另一个 .h 文件,其中包含你所有的使用,比如 my_lib_import_names.h 并且只需 #include 来获得你想要的吗?

    您可能会遇到未声明类的问题,但您可以使用以下方法绕过它:

    #ifdef UTILITY_STRING_H_ 
      using Utility::String;
    #endif
    ..
    #ifdef UTILITY_SOMETHING_ELSE_H
       using Utility::SomethingElse;
    #endif
    

    ..

    你怎么看?

    这样您就可以在您的库 .h 中保留“预期”的行为,但也可以按照您喜欢的方式进行操作。您还可以在类中保留命名空间的优势(以必须维护新的 .h 文件为代价)。

    【讨论】:

      【解决方案2】:

      这在最好的情况下似乎毫无意义,在最坏的情况下看起来很烦人。

      让开发人员决定使用哪些命名空间以及完全限定哪些命名空间有什么问题?

      【讨论】:

        【解决方案3】:

        老实说,我相信这就是 using namespace 指令的用途。考虑到 using namespace 指令就是这样做的,您无需添加此预处理器机制。

        【讨论】:

          【解决方案4】:

          如果您只想为命名空间中声明的每个名称添加 using 声明,那么使用命名空间毫无意义。

          让您的头文件的用户决定他们希望如何使用这些头文件。如果有人要使用 using 声明,让他直接在 .cpp 文件中进行;这将使该 .cpp 文件中的代码更清晰,因为名称的来源很明显。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-11-09
            • 2020-09-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多