2011-03-01 115 views
1

我正在编写由几个“包”组成的实用程序库。每个包中的类都包含在各种名称空间中。我对如何通过在类声明结尾自动声明使用声明来简化情况有所了解(参见下文),这将避免程序员在cpp文件中执行它。声明命名空间声明后使用语句

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

using Utility::String; 

我的理解是,如果用户包括头STRING.H和字符串在公用那么程序员将要使用的字符串。显然这可能是坏的,如果有外部类链包括一堆文件弄脏名称空间,所以我认为如何使它成为#define代替。

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

#ifdef AUTO_DECLARE_NAMESPACE 
    using Utility::String; 
#endif 

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

这是一个好主意还是有我忽略的东西?

回答

6

如果您只是要为名称空间中声明的每个名称添加使用声明,则使用名称空间没有意义。

让头文件的用户决定他们想要如何使用头文件。如果有人想使用使用声明,请让他直接在.cpp文件中执行;这将使该.cpp文件中的代码更清晰,因为它将显而易见名称的起源。

0

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

2

这似乎是最好的毫无意义,最坏的是恼人的。

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

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文件为代价)。