我试图在下面的简约示例中质疑我自己的代码正确性,其中头文件将标识符提升到当前命名空间.
#include <string>
namespace mine {
using std::string; // std::string lifted into mine
struct agent
{
string name;
};
}
Run Code Online (Sandbox Code Playgroud)
这是我最近作为使用typedef的另一种替代方法的建议:
#include <string>
struct agent
{
private:
typedef std::string string;
public:
string name;
};
Run Code Online (Sandbox Code Playgroud)
我认为第一个选项更正确,因为它使用了我自己的命名空间,这是一个应该习惯的实践(命名空间创建和管理).Meanhile,因为标识符在我控制的命名空间内被提升,所以它使这成为一种安全的方法.
但是,我有第二个想法.例如,不小心使用命名空间我,例如使用using指令,也会将std :: string带入视图.另一个问题是我暴露了std :: string太多了.甚至命名空间的地区矿山的地方是没有必要的或希望的.
在我看来,总是在尽可能低的范围内工作并从那里开始工作似乎更为正确.只暴露绝对必要的.我在第二个例子中将typedef设为私有的事实正是因为这个原因.但是后来我没有按照第二个例子的建议.
但在另一方面,我担心的事实有人可能会滥用命名空间导致矿:
using namespace mine;
Run Code Online (Sandbox Code Playgroud)
乍一看,我们知道这不是命名空间的正确使用模式.但不可否认,有些情况可能是可取的.您认为第一种方法的有效性如何?
小智 8
我原以为这个显而易见的解决方案是:
namespace mine {
struct agent
{
std::string name;
};
}
Run Code Online (Sandbox Code Playgroud)
我个人根本不在头文件中使用指令.当然,在实现文件中.
我通常这样做:
// In header file:
#include <string>
namespace mine {
struct agent
{
std::string name;
};
}
// In source file:
using std::string;
namespace mine {
// Code
}
Run Code Online (Sandbox Code Playgroud)
这样你就不必在实现中一遍又一遍地写出std ::但是你可以避免使用你的头文件无意中导入std :: symbols的问题.