c++ - 命名空间正确性

标签 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 。甚至可能到不需要或不需要的命名空间我的区域。

在我看来,始终在尽可能低的范围内工作并从那里开始工作更为正确。只暴露绝对必要的。我在第二个例子中将 typedef 设为私有(private)就是因为这个。但是在第二个例子中我没有遵循我自己的建议。

但另一方面,我担心有人可能滥用命名空间我的:

using namespace mine;

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

最佳答案

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

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

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

关于c++ - 命名空间正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1219393/

相关文章:

naming-conventions - 项目命名

c++ - 是否可以在不编写任何 Objective-C 代码的情况下全部使用 C++ 开发 iPhone/iPad 应用程序?

c++ - std::vector<struct> 到 const std::vector<const struct>*

c++ - C++ 中的内存模型 : sequential consistency and atomicity

c++ - 使用 g++ 编译 SDL 的问题

python - URL 上的 Django NoReverseMatch

c++ - 使用 g++ 链接时出现错误

c# - 使用 HttpUtility.UrlEncode() 使程序集的命名空间 "disappear"?

c++ - 如何在 C++ 的命名空间内使类私有(private)?

PHP `use` 导入命名空间导致页面崩溃