我是C ++的初学者,所以如果答案很明显,可能就是我正在寻找的那个。我正在阅读this thread中的第二个回复并感到困惑。
#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)?
答案 0 :(得分:3)
这只是一个已定义的功能。我的意思是,为什么它没有直接内置“但是没有必要包含一个新库,所以它不是内置的吗?
根据定义,C ++库是C ++的一部分。但是,它不是核心语言的一部分。 C ++是一种庞大而庞大的语言。让编译器知道该语言的每一个角落都会让编译器变得庞大而且加载缓慢。相反的理念是保持核心有点小,并使程序员能够通过#including
头文件扩展功能。指明他们需要什么。
为什么命名空间不会自动设置为std?
这实际上会将各种非常常见的词组成关键词。你不应该使用的单词列表(关键字,C中的全局函数,POSIX或Microsoft保留的单词,......)已经非常庞大。将C ++标准库放在命名空间std中是一个特性。将所有这些名称放在全局命名空间中将是一个巨大的错误。
答案 1 :(得分:2)
“这只是一个已定义的函数。我的意思是,为什么它不是直接内置的”但是没有必要导入一个新库,所以它不是内置的吗?是否自动导入std库(如果是,为什么命名空间不会自动设置为std)?
嗯,通过defined function
意味着,很可能该函数已经预先编写,并在库中定义,它不是直接内置的,可能是因为它是这样设计;语言中只包含核心要素,其他所有内容都在库中,因此程序员可以导入他们想要的内容。
内置,通常是关键字,例如for
或while
。
不,std不是自动导入的,因为它的设计使得程序员可以选择他们想要的命名空间,比如自定义命名空间或std。自动拥有std的一个例子是:
假设你自动定义了std,那么你想做using namespace foo;
,现在如果foo也有函数cout
,你会遇到一个很大的问题,比如你想要这样做;
// code above
cout << "Hello, World" << endl;
// code below
编译器将使用哪个命名空间函数?默认或您的foo
命名空间cout
?为了防止这种情况,没有默认的命名空间设置,只留给程序员。
希望有所帮助!
答案 2 :(得分:1)
在您的代码中,您有以下行:
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) { /*...*/ }
}
它不会与标准冲突,也不会与某些定义了没有命名空间的swap的库发生碰撞。