2016-11-21 82 views
0

我知道函数的原型在各自的头文件中。标准函数的声明在标准库中,这就是为什么我们使用术语“using namespace std”。但是非标准函数的声明存储在哪里呢?C++中存储的非标准函数声明在哪里?

+12

_that这就是为什么我们使用术语“using namespace std”_;一般来说,[我们不](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice)。 –

+0

执行者希望他们成为的任何地方,除了'std'命名空间以外的任何地方。通常在全局命名空间中。 –

+0

不,经验丰富的C++开发人员从来不会使用“using namespace std;”,因为这会导致不明确的错误。就非C++库函数而言,它们是在未命名的全局名称空间中声明的。 –

回答

3

标准库不必作为头文件实现。

C++标准指示当您#include <vector>时会发生什么。它不要求vector是您的系统上的头文件;它可以作为一个编译器内在来实现,它引入了某些符号和类型。

它规定了当你与这些符号和类型交互时会发生什么。

通常很容易做到这一点作为头文件;但std中有一些C++功能无法在C++中实现。通常情况下,“表面”交互是在C++中完成的,但他们后来又回到了魔术编译器内部函数。

std中的大部分都可以存在,并且确实存在为纯粹的头文件。它的其他部分通常被编译成库,通常主要用C或C++编写。他们与操作系统库进行交互,操作系统库也主要由C语言编写(有时也用C++和其他语言编写),后者又与用C语言和汇编语言混合编写的硬件特定代码进行对话。

“运行时”库可以动态或静态链接到您的输出,并充当一种C++所需和特定操作系统提供的“粘合剂”。


其他图书馆可以存在。它们的头文件以编译器确定的方式存储,并以编译器确定的方式进行搜索。动态地或静态地链接它们的库也以编译器确定的方式完成,就像所述库存在的地方一样。

只要它们输出与编译器期望的ABI相匹配的接口,就可以用多种语言编写它们。

+0

你能简单解释一下吗?我没有完全得到你的答案。谢谢。 –

+0

@TanmayBhatnagar如何理解C++如何编译为可执行文件或库? – Yakk

+0

我明白,当我们编译我们的代码时,链接将头文件中的所有原型链接到它们各自的函数声明。然后编译器将源代码转换为目标代码。 –