2

我是 C++ 的初学者,所以如果答案很明显,它可能就是我正在寻找的那个。我正在阅读此线程中的第二个回复并感到困惑。

#include <algorithm>
#include <cassert>

int
main()
{
    using std::swap;
    int a(3), b(5);
    swap(a, b);
    assert(a == 5 && b == 3);
}

我没有得到的是“这只是一个定义的函数。我的意思是,为什么它不是直接内置的”但是不需要include新的库,所以它不是内置的吗?是否会自动导入 std 库(如果是,为什么名称空间不会自动设置为 std)?

4

3 回答 3

3

这只是一个定义的函数。我的意思是,为什么它不是直接内置的”但是没有必要包含一个新的库,所以它不是内置的吗?

根据定义,C++ 库是 C++ 的一部分。但是,它不是核心语言的一部分。C++ 是一门巨大的语言。让编译器立即了解语言的每一个角落和缝隙会使编译器变得庞大且加载缓慢。相反,其理念是使核心保持较小,并让程序员能够通过#including头文件扩展功能。指定他们需要什么。

为什么命名空间不会自动设置为 std?

这基本上会将各种非常常见的单词变成关键字。您不应该使用的单词列表(关键字、C 中的全局函数、POSIX 或 Microsoft 保留的单词……)已经很庞大了。将 C++ 标准库放在命名空间 std 中是一项功能。将所有这些名称放在全局命名空间中将是一个巨大的错误。

于 2012-06-11T19:10:58.847 回答
3

“这只是一个定义的函数。我的意思是,为什么它不是直接内置的”但是不需要导入新库所以它不是内置的吗?是否会自动导入 std 库(如果是,为什么名称空间不会自动设置为 std)?

好吧,defined function这意味着,很可能该函数已经预先编写并在library中定义,它不是直接内置的,可能是因为它是这样设计的;该语言中仅包含核心要素,其他所有内容都在库中,因此程序员可以导入他们想要的内容。

通过内置,通常它是一个关键字,例如forwhile

不,std 不会自动导入,因为它的设计目的是让程序员可以选择他们想要的命名空间,比如自定义命名空间或 std。自动拥有 std 不好的一个例子是:

假设你自动定义了 std,那么你想做using namespace foo;,现在如果 foo 也有 function cout,你会遇到一个大问题,比如说你想做这个;

// code above
cout << "Hello, World" << endl;
// code below

编译器将如何使用哪个命名空间函数?默认值还是您的foo命名空间cout?为了防止这种情况,没有设置默认命名空间,由程序员决定。

希望有帮助!

于 2012-06-11T18:56:22.707 回答
2

在您的代码中,您有以下行:

using std::swap;

所以调用swap不需要std::。因为assert,它被定义为一个宏,所以它也不需要std::. 如果您没有使用using,那么除了宏之外,您将不得不使用std::来引用标准 C++ 库提供的函数和对象。

当您编译程序以创建可执行文件时,标准 C++ 库通常会链接到您的程序中。从这个角度来看,您可能会认为它是“内置的”。但是,术语“内置”通常意味着编译器将单词视为swap关键字,此处并非如此。swap是定义在algorithm头文件中的模板函数,assert是定义在cassert.

命名空间可以方便地按名称轻松划分软件的各个部分。所以如果你想定义你自己的swap函数,你可以把它放到你自己的命名空间中。

namespace mine {
    template <typename T> void swap (T &a, T &b) { /*...*/ }
}

它不会与标准冲突,也不会与一些定义了没有命名空间的交换的库发生冲突。

于 2012-06-11T18:54:07.200 回答