命名空间正确性

时间:2009-08-02 17:53:35

标签: c++ namespaces

我试图在下面的极简主义示例中质疑我自己的代码正确性,其中头文件将标识符提升到当前名称空间。

#include <string>

namespace mine {

    using std::string; // std::string lifted into mine

    struct agent
    {
        string name;
    };
}

这是我最近提出的另一种使用typedef的替代方法:

#include <string>

struct agent
{
    private:
        typedef std::string string;
    public:
        string name;
};

我认为第一个选项更正确,因为它使用了我自己的命名空间,这是一个应该习惯的实践(命名空间创建和管理)。因为标识符在我控制的命名空间内被提升,所以它是一种安全的方法。

然而,我有第二个想法。例如,不小心使用命名空间 mine ,例如使用using指令,也会将std :: string带入视图。另一个问题是我暴露了std :: string太多了。甚至可能是命名空间 mine 的区域,在那里没有必要或不可取。

在我看来,始终在尽可能低的范围内工作并从那里开始工作似乎更为正确。只暴露绝对必要的。我在第二个例子中将typedef设为私有的事实正是因为这个原因。但是后来我没有按照第二个例子的建议。

但另一方面,我担心的是有人可能滥用名称空间 mine

using namespace mine;

乍一看,我们知道这不是命名空间的正确使用模式。但不可否认,有些情况可能是可取的。您认为第一种方法有多有效?

3 个答案:

答案 0 :(得分:8)

我认为显而易见的解决方案是:

namespace mine { 
    struct agent
    {
        std::string name;
    };
}

我个人根本不在头文件中使用using指令。当然,在实现文件中。

答案 1 :(得分:7)

我通常这样做:

// In header file:

#include <string>

namespace mine {

    struct agent
    {
        std::string name;
    };
}

// In source file:

using std::string; 

namespace mine {
   // Code
}     

这样你就不必在实现中一遍又一遍地写出std ::但是你可以避免使用你的头文件无意中导入std :: symbols的问题。

答案 2 :(得分:1)

我通常这样做:

// In header file
#include <string>
namespace mine 
{
    namespace detail 
    {
        using std::string;

        struct agent
        {
            string name;
        }
    }

    using detail::agent;
}

这样我就不必在标题中输入std::,但有人仍然可以执行using namespace mine;而不会从std导入名称。