问得好,瑞恩。 using namespace 所做的是将给定命名空间(作用域)中的所有符号导入到使用它的作用域中。例如,您可以执行以下操作:
namespace A {
struct foo {};
}
namespace B {
using namespace A;
struct bar : foo {};
}
在上述示例中,命名空间 A 中的所有符号都在命名空间 B 中可见,就像它们在那里声明一样。
此导入仅对给定的翻译单元产生影响。因此,例如,当在您的实现文件(即.cpp)中执行using namespace std; 时,您基本上将所有符号从std 命名空间导入到全局范围内。
您还可以导入某些符号而不是所有符号,例如:
using std::cout;
using std::endl;
您可以在全局范围、命名空间范围或函数范围内执行此操作,如下所示:
int main ()
{
using namespace std;
}
由程序员决定何时使用完全限定名称以及何时使用using 关键字。通常,将using 放入头文件是一种非常糟糕的做法。专业的 C++ 程序员几乎从不这样做,除非这是解决某些问题所必需的,或者他们 100% 确定它不会为使用该标头的人弄乱类型解析。
但是,在源文件中(没有人包含源文件),只要在不同的命名空间中没有冲突的名称,就可以执行任何类型的 using 语句。这只是口味问题。例如,如果在整个代码中使用了大量来自不同名称空间的符号,我希望至少有一些关于它们实际声明位置的提示。但是每个人都熟悉 STL,所以using namespace std; 应该永远不会造成任何伤害。
也可能有一些长命名空间,在这些情况下命名空间别名会派上用场。例如,有一个 Boost.Filesystem 库,它将其所有符号都放在 boost::filesystem 命名空间中。使用那个命名空间太多了,所以人们通常会这样做:
namespace fs = boost::filesystem;
fs::foo ();
fs::bar ();
此外,在标头中使用命名空间别名几乎是可以的,如下所示:
namespace MyLib {
namespace fs = boost::filesystem;
}
.. 并受益于更少的打字。发生的情况是,将使用此标头的用户不会通过说 using namespace MyLib; 来导入整个文件系统库。但是,他们将从您的库中导入可能与其他内容冲突的“fs”命名空间。所以最好不要做,但如果你太想要了,总比在那里说using namespace boost::filesystem好。
所以回到你的问题。如果您使用 C++ I/O 流编写库,最好不要在标题中包含任何 using 语句,我会在每个 cpp 文件中使用 using namespace std;。例如:
somefile.hpp:
namespace mylib {
class myfile : public std::fstream {
public:
myfile (const char *path);
// ...
};
}
somefile.cpp:
#include "somefile.hpp"
using namespace std;
using namespace mylib;
myfile::myfile (const char *path) : fstream (path)
{
// ...
}