什么是 C 和 C++ 标准库?

 2024-02-21 04:02:11  阅读 0

IT 头条新闻

每天推送最新最热的IT新闻

----【IT服务圈报】第81期

源码/开源中国

简要介绍编写C/C++应用程序的领域、标准库的作用以及它在各种操作系统中的实现方式。

我使用C++已经有一段时间了,从一开始让我困惑的是它的内部结构:我使用的内核函数和类来自哪里? 谁发明了它们? 它们是否打包在我的系统中的某个位置? 有官方的 C++ 手册吗?

在这篇文章中,我将尝试从C和C++语言的本质到实际实现来回答这些问题。

C 和 C++ 是如何制定的

当我们谈论 C 和 C++ 时,我们实际上指的是一组规则,这些规则定义了(编程)语言应该做什么、应该如何运行以及应该提供什么功能。 C/C++ 编译器必须遵循这些规则才能处理用 C/C++ 编写的源代码并生成二进制应用程序。 这听起来非常接近 HTML:浏览器遵循一组指令,以便能够以清晰的方式呈现网页。

与 HTML 一样,C 和 C++ 的规则也是理论上的。 国际标准化组织 (ISO) 的一大群人每年都会聚集多次,讨论和定义语言规则。 是的,C和C++是标准化的东西。 他们最终都会出版一本名为“标准”的官方书籍,您可以从他们的网站上购买该书。 随着语言的发展新的(指官方标准书)将会发布,每次定义一个新的标准。 这就是为什么我们有不同版本的 C 和 C++:C99、C11、C++03、C++11、C++14 等,其数字与发布/发布的年份相对应。

这些标准是非常详细且技术上最新的文档:我不会将它们视为手册。 通常分为两部分:

1、C/C++的功能和特点;

2. C/C++ API - 开发人员可用于其 C/C++ 程序的类、函数和宏的集合。 它也被称为标准库。

例如,下面是 C 标准库第一部分的摘录,它定义了 main 函数的结构:

linux so库命名规范_linux命名空间详解_so库反编译

1、main的定义,程序启动时调用的函数。

以下是描述 CAPI 成员 fmin 函数的同一标准的另一个摘录:

linux命名空间详解_linux so库命名规范_so库反编译

2. 在math.h文件中定义min函数。

正如您所看到的,几乎没有涉及任何代码。 必须有人阅读标准并将其转换成计算机可以消化的东西。 这就是人们在开发编译器和(功能)实现时所做的事情:前者是可以读取和处理 C 和 C++ 源文件的工具,后者将标准库转换为代码。 让我们仔细看看。

C标准库

C 标准库,也称为 ISO C 库,是用于完成输入/输出处理、字符串处理、内存管理、数学计算和许多其他操作系统服务等任务的宏、类型和函数的集合。 它是在C标准(例如C11标准)中定义的。 它的内容分布在不同的头文件中,比如我上面提到的math.h。

C++标准库

与 C 标准库类似的概念,但仅适用于 C++。 C++ 标准库是一组 C++ 模板类,提供常见的编程数据结构和函数,例如链表、堆、数组、算法、迭代器以及您能想到的任何其他 C++ 组件。 C++ 标准库还包含C 标准库,并在C++ 标准(例如C++11 标准)中定义。

实现C/C++标准库

这是我们开始讨论实际代码的地方。 致力于标准库实现的开发人员阅读官方 ISO 规范并将其转换为代码。 它们必须依赖操作系统提供的功能(读/写文件、分配内存、创建线程……所有这些都称为系统调用),因此每个平台都有自己的标准库实现。 有时它是系统内核的一部分,有时它作为附加组件(编译器)提供,必须单独下载。

GNU/Linux版本实现

GNU C 库,也称为 glibc,是 GNU 项目对 C 标准库的实现。 并非所有标准 C 函数都可以在 glibc 中找到:大多数数学函数实际上是在 libm 库中实现的,这是一个单独的库。

迄今为止,glibc 是 Linux 上使用最广泛的 C 库。 然而,在 20 世纪 90 年代的一段时间内,glibc 有一个竞争对手,称为 Linux libc(或简称 libc),它源自 glibc 1.x 的一个分支。 有一段时间,Linux libc 是许多 Linux 发行版中的标准 C 库。

经过多年的发展,glibc 比 Linux libc 更有优势,所有使用它的 Linux 发行版都转回了 glibc。 因此,如果您在磁盘上发现一个名为 libc.so.6 的文件,请不要担心:它是 glibc 的现代版本。 为了避免与以前的 Linux libc 版本混淆,版本号增加到 6(他们不能将其命名为 glibc.so.6:所有 Linux 库都必须以 lib 前缀开头)。

另一方面,C++标准库的实现是在++或GNU标准C++库中。 这是一个正在进行的项目,旨在在 GNU/Linux 上实现标准 C++ 库。 一般来说,所有常规的 Linux 发行版都默认使用 ++。

Mac和iOS版本实现

在 Mac 和 iOS 上,C 标准库的实现是位于 /usr/lib/.dylib 的核心库的一部分。 包含其他组件,例如数学库、线程库和其他低级实用程序。

关于 C++ 标准库,在 OS X (V10.9) 之前的 Mac 上,++ 是默认选项。 这与现代基于 Linux 的系统上的实现相同。 从 OS X 开始,Apple 转而使用 libc++,它是 Mac 官方编译器框架 LLVM 项目引入的 GNU++ 标准库的替代品。

iOS 开发人员可以使用 iOS SDK(软件开发工具包)访问标准库,这是一组允许创建移动应用程序的工具。

版本实现

在 中,标准库的实现被严格限制为 ,这是微软的官方编译器。 它们通常称为 C/C++ 运行时库 (CRT),它涵盖了 C/C++ 的实现。

一开始,CRT 是作为 .DLL 库实现的(我猜,当时没有可用的 C++ 标准库)。 从95开始,开始迁移到【版本号】.DLL(.DLL、.DLL等),想必其中也包含了C++标准库。 1997 年左右,他们决定将文件名简化为 .DLL,不幸的是,这导致了 DLL 的混乱。 这就是为什么从 7.0 版本开始,他们转回为每个版本使用单独的 DLL。

2015年推出深度CRT重建。 C/C++ 标准库的实现已移至新库,即 C 运行时库(CRT 或 UCRT),并编译为 .DLL。 UCRT 现在是其中之一,从 10 开始作为操作系统的一部分提供。

版本实现

它是为其操作系统编写的C标准库实现,在底层直接使用。 第三方开发人员可以通过本机开发套件 (NDK) 访问它,该工具集允许您使用 C 和 C++ 代码编写应用程序。

在C++方面,NDK提供了很多版本的实现:

我可以使用不同版本的实现代码来代替默认实现吗?

如果您正在使用资源非常有限的系统,则通常需要引用 C 标准库的不同实现。 例如-ng、musl libc和diet libc等,都适合嵌入式Linux系统的开发,提供更小的二进制文件和更少的内存占用。

C++标准库也有不同的实现版本:C++标准库、uSTL、EASTL等。后两者确实只关注模板部分,而不是完整的库,而且它们的开发速度优先。 版本化库注重可移植性。

如果我们脱离标准库怎么办?

不使用标准库很容易:只需不在您的程序中包含它们的任何头文件,您的工作就完成了。 但是,为了使此操作有意义,您需要通过某些提供的系统调用来与操作系统进行交互。 正如我之前所说,这就是标准库中的函数/方法在底层实现的内容。 您很可能还必须调用这些方法来与硬件设备交互。

如果这听起来令您兴奋,那么网上的一些人已经开始尝试在不导入标准库的情况下创建工作流程。 这种方法失去了可移植性,因为您依赖于特定操作系统提供的功能。 然而,通过困难的方式,即使使用高级库,您也会学到更多并更好地理解您正在做的事情。

除了知识之外,当你从事嵌入式操作系统时你不想引入标准库:因为代码不需要移植,在有限的内存中每个字节都很重要,这会让你写得更准确。 代码。 另一个使用上下文是,这里人们试图在程序的二进制大小内保留高质量的音频和视频——4K仍然不是最小值:有些使用1K、256字节、64字节甚至32字节来竞争。 那里不允许使用标准库!

标签: 标准 操作 字节

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码