除了 'std',C++中有哪些有用的命名空间?

7
每当我阅读有关C++的书籍时,我都会看到一个“using namespace std”的示例。
我想知道在C++中是否还存在其他有用的命名空间?

14
烧掉那些书。 - Edward Strange
5个回答

13

boost.
std::tr1。(技术报告1)

然而,using namespace std; 不是一个好主意,特别是在头文件中。每次使用它都会多5个字符,更好的选择是使用明确的命名空间,这样可以使代码更清晰、减少冲突。


7

C++标准库中的所有内容都在std命名空间中(或者是在std的嵌套命名空间中)。

当然,其他库使用不同的命名空间。您需要查阅您正在使用的其他库的文档,以确定它们使用的命名空间。

尽管如此,使用指令通常是不好的做法。最好使用using声明从一个命名空间中使用单个名称。这对于std命名空间尤为重要。在std命名空间中有许多常用的名称,很容易遇到难以解决的问题,其中您尝试引用自己的函数或类并意外地引用了一个标准库函数或类。例如,以下是错误的:

using namespace std;
cout << "Hello world" << endl;

这更好:

using std::cout;
using std::endl;
cout << "Hello world" << endl;

在我看来,当你在整个程序中使用完全限定的名称时,代码通常会更加清晰;这使得实体的来源更加清晰,并且留下了较少的错误空间:

std::cout << "Hello world" << std::endl;

(当然,所有规则都有例外。例如,在使用std :: bind时,使用std :: placeholders :: _1及其相关内容非常麻烦。使用using std :: placeholders; 然后只引用_1,_2等代码更容易阅读。但是,using指令应该在函数内部而不是命名空间范围内。)

忽略上一个评论。(Bill,应该是namespace po = boost::program_options,而不是using namespace po = boost::program_options - Billy ONeal

2
我很惊讶没有人提到 std::rel_ops 命名空间。它定义了 operator!=operator>operator<=operator>=
您可以通过使用指令或声明将其引入作用域,并为您的类型定义 operator<operator==。然后,由 std::rel_ops 提供的运算符将根据这两个运算符进行操作。

1

这是C++标准库的命名空间。据我所知,这是您“开箱即用”的唯一命名空间。其他所有命名空间都必须由您自己定义或从其他库中获取。


0

C++标准库中的所有文件都在std命名空间中声明其所有实体。只有当您使用第三方库(如boost)或定义自己的命名空间时,才会遇到其他命名空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接