1

我正在编写一个由几个“包”组成的实用程序库。每个包中的类都包含在不同的命名空间中。我知道如何通过在类声明的末尾自动声明 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

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

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

4

4 回答 4

6

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

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

于 2011-03-01T02:52:35.367 回答
2

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

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

于 2011-03-01T02:59:12.963 回答
0

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

于 2011-03-01T02:56:30.127 回答
0

难道你不能有另一个 .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 文件为代价)。

于 2011-03-03T02:47:59.657 回答