"built-in" C++函数

"built-in" functions in C++

本文关键字:函数 built-in C++      更新时间:2023-10-16

我是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)?

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

嗯,defined function它的意思是,很可能这个函数已经预先编写好了,并在库中定义,它不是直接内置的,可能是因为它是这样设计的;语言中只包含核心要素,其他一切都在一个库中,所以程序员可以导入他们想要的东西

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

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

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

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

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

希望对您有所帮助!

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

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

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

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

在你的代码中,你有这样的行:

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) { /*...*/ }
}

它不会与标准或定义交换而没有命名空间的某些库发生冲突。