您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

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

时间:2019-06-19 12:13:01  来源:  作者:

本文简要介绍编写 C/C++ 应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的。

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

 

C 和 C++ 是如何制订的

当我们谈论 C 和 C++ 时,实际上是指一组定义(程序)语言应该做些什么,如何表现,应该提供哪些功能的规则。C/C++ 的编译器为了处理 C/C++ 编写的源代码必须跟随着这些规则,并生成二进制应用程序。听起来非常接近于 html:浏览器遵循着一组指令,所以它们可以以明确的方式来渲染网页。

与 HTML 一样,C 和 C++ 的规则都是理论上的。国际标准化组织(ISO)的一大群人每年都会聚集几次来讨论和定义语言规则。没错,C 和 C++ 是标准化的东西。他们最终都会得到一本官方的叫标准的书,你可以从他们的网站中购买。随着语言的发展新的 papers(指官方的叫标准的书)会被发布,每一次都定义一个新的标准。这就是为什么我们会有不同的 C 和 C++ 版本的原因:C99, C11, C++03, C++11, C++14 等等,数字与出版/发布年份相符。

这些标准都市非常详细和有技术新的文档:我不会把它们当作手册。通常会分为两部分:

● 1.C/C++ 的功能和特性;

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

例如,这里有个来自于 C 标准库第一部分的摘选,它定义了 main 函数的结构:

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

 

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

这是另外一个来自与同样标准的摘录,描述了 CAPI 的成员 --fmin 函数:

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

 

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, 是 C 标准库的 GNU 项目实现。并非所有的标准 C 函数都可以在 glibc 中找到:大多数数学函数实际上是在 libm 库中实现的,这是一个独立的库。

至今,glibc 是 Linux 上使用最广泛的 C 库。 然而,在 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++ 标准库的实现位于 libstdc++ 或 GNU 标准 C++ 库中。这是一个正在进行的在 GNU/Linux 上实现标准 C++ 库的项目。一般来说,所有常规的 Linux 发行版都默认使用 libstdc++。

 

macIOS 版实现

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

关于 C++ 标准库,在 OS X Mavericks(V10.9)之前的 Mac 上,libstdc++ 是默认选项。这在现代的基于 Linux 的系统上可以找到的同样的实现。自 OS X Mavericks 开始,Apple 切换到使用 libc++,这是 LLVM 项目——Mac 官方编译器框架——所引入的 GNU libstdc++ 标准库的替代。

IOS 开发者可以使用 iOS SDK(软件开发工具包)来访问标准库,它是一系列允许创建移动应用程序的工具。

 

windows 版实现

在 Windows 上,标准库的实现一直严格限定在 Visual Studio 中,它是微软官方的编译器。他们通常称之为 C/C++ 运行时库(CRT),并且它涵盖了 c/c++ 二者的实现。

在最开始,CRT 被实现为 CRTDLL.DLL 库(我猜,当时没有可用的 C++ 标准库)。从 Windows 95 开始,Microsoft 开始将其迁移到 MSVCRT [版本号] .DLL(MSVCR20.DLL,MSVCR70.DLL 等)之上,据推测也包含 C++ 标准库。在 1997 年,他们决定将文件名简化为 MSVCRT.DLL,这不幸导致了令人讨厌的DLL混乱。这就是为什么从 Visual Studio 7.0 版开始,他们切换回每个版本使用单独的 DLL 了。

Visual Studio 2015 引入了深度的 CRT 重构。C/C++ 标准库的实现迁移到一个新库,Universal C 运行时库 (Universal CRT 或 UCRT),编译为 UCRTBASE.DLL。 UCRT 目前已经成为 Windows 组之一,从 Windows 10 开始作为操作系统的一部分提供。

 

Android 版实现

Bionic 是 google 为其 Android 操作系统所编写的 C 标准库实现,它直接在底层使用。 第三方开发者可以通过 Android 原生开发工具包(NDK)访问 Bionic,该工具集允许你使用 C 和 C++ 代码编写 Android 应用程序。

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

● libc++,从从 Lollipop 开始的官方安卓系统和现代 Mac 操作系统都将其作为 C++ 标准库使用。从 NDK 发布 17 版本开始,它将成为 NDK 中唯一可用的 C++ 标准库实现;

● gnustl,libstdc++ 的别名,这两者在 GNU/linux 是同一个库。这个库的已被弃用,它将在 NDK 发布 18 中删除;

● STLport,由 STLport 项目编写的 C++ 标准库的第三方实现,自 2008 年以来一直处于不活跃状态。与 gnustl 一样,STLport 将在 NDK 发布 18 中移除。

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

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

C++ 标准库也有不同的实现版本:Apache C++ 标准库,uSTL 以及 EASTL 等等。后面两个实际上仅关注模板部分,而不是完整的库,并且他们是在速度优先的情况下开发的。Apache 版本的库注重的是可移植性。

 

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

不使用标准库很简单:只要在你的程序中不引入它们的任何一个头文件,你的工作就完成了。然而,为了让这个操作更有意义一些,你需要通过一些提供的系统调用使用某种方法与操作系统互动。就像我之前说的,这就是标准库中的函数/方法在底层实现的时候所使用的。很可能你也会不得不调用这些方法来与硬件设备交互。

如果对你来说这听起来很让人激动,有些人已经开始在网上尝试在不导入标准库的情况下创建工作流程。因为你依赖于一个特定操作系统所提供的函数,这种方式会丧失可移植性。然而通过使用这种艰难的方式,肯会让你学到更多,而且让你更好的理解当你所做的事情,即使是在使用高级库的时候。

除了知识,当你在嵌入式操作系统上面工作的时候你不会想去引入标准库:因为代码不需要移植,在有限的内存中每个字节都很重要,这会让你更加精准的写代码。另一个使用背景就是 demoscene,在这里人们尽量有限的程序的二进制大小中去保留高质量的音视频——4K仍然不是最小值:一些 demoparties 使用 1K,256 字节,64 字节或者甚至 32 字节来竞争。在那里不允许使用标准库!
 



Tags:C   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
以京训钉开发平台接口文档为例,使用HttpClient类请求调用其接口,对数据进行增删改查等操作。 文档地址: https://www.yuque.com/bjjnts/jxd/bo1oszusing System;using System.C...【详细内容】
2021-12-28  Tags: C  点击:(1)  评论:(0)  加入收藏
你的C盘空间还剩多少呢?电脑在使用,C盘空间在减少,各种缓存和垃圾文件占据其中,随着时间的推移电脑显得越发臃肿了。当C盘出现飘红的状况,你是怎么解决的呢? 很多小伙伴不敢轻易动...【详细内容】
2021-12-28  Tags: C  点击:(1)  评论:(0)  加入收藏
我们在进行英文学术论文写作的时候,使用类似于“sound good.”的短语和术语可能感觉会不错。然而,最终这些短语并不是必要的,甚至会产生更糟糕的效果(模糊论文的内容,让读者难以...【详细内容】
2021-12-28  Tags: C  点击:(2)  评论:(0)  加入收藏
工欲善其事必先利其器,如何写好SCI论文已经是大家读博或者博后期间的必备技能。那么除了我们必须大量阅读好的文献之外,我们还需要借助不同的工具来达到事半功倍的效果。因此...【详细内容】
2021-12-28  Tags: C  点击:(3)  评论:(0)  加入收藏
硬件升级和软件升级一样,各路大神总归要第一时间趟这潭水,作为普通消费者还是老老实实等一段时间为好,原因就是省钱、省心。 最近Intel第12代CPU上市了,不少小伙伴有升级的需求,...【详细内容】
2021-12-28  Tags: C  点击:(3)  评论:(0)  加入收藏
一、前因闲来没事,想着升级下树莓派中的应用,没曾想,全是最新的,害我以为被黑客眷顾,帮我升级了。多方查证,才知道,是上次搭建的photoprism搞的鬼,不过也不全是它的锅,只是它的yml文...【详细内容】
2021-12-28  Tags: C  点击:(2)  评论:(0)  加入收藏
2021年12月27日,公安部正式公布了《机动车驾驶证申领和使用规定》,并且将在2022年4月1日开始正式实施,对于房车族影响颇深的C6驾照也在本次的新规定中,C6驾照即将面世,对拖挂房车...【详细内容】
2021-12-28  Tags: C  点击:(5)  评论:(0)  加入收藏
C1能驾驶拖挂房车吗图片来之:今日头条“北京交警”官方视频截图随着时代的发展,人们对自驾旅游随心所欲的需求,目前市面上出现了B型房车、拖挂房车等。是我们的一家出门旅游,为...【详细内容】
2021-12-28  Tags: C  点击:(1)  评论:(0)  加入收藏
大家好, 前面我们讲过利用常规的方法,制作二级下拉列表辅助表。 今天我们就来介绍一下,Dax 度量值(Power Pivot)和 Power Query 的 M 函数做法,主要带大家拓展思路。 如下图,我们现...【详细内容】
2021-12-28  Tags: C  点击:(1)  评论:(0)  加入收藏
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  Tags: C  点击:(3)  评论:(0)  加入收藏
▌简易百科推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  中年农码工    Tags:C#   点击:(2)  评论:(0)  加入收藏
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  一起学嵌入式    Tags:C 语言   点击:(11)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  今朝我的奋斗    Tags:c#   点击:(21)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  梦回故里归来    Tags:shell脚本   点击:(18)  评论:(0)  加入收藏
一、编程语言1.根据熟悉的语言,谈谈两种语言的区别?主要浅谈下C/C++和PHP语言的区别:1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互...【详细内容】
2021-12-15  linux上的码农    Tags:c/c++   点击:(17)  评论:(0)  加入收藏
1.字符串数组+初始化char s1[]="array"; //字符数组char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添&lsquo;\0&lsquo;printf("%s,%c\n",s1,s2[2]);...【详细内容】
2021-12-08  灯-灯灯    Tags:C语言   点击:(47)  评论:(0)  加入收藏
函数调用约定(Calling Convention),是一个重要的基础概念,用来规定调用者和被调用者是如何传递参数的,既调用者如何将参数按照什么样的规范传递给被调用者。在参数传递中,有两个很...【详细内容】
2021-11-30  小智雅汇    Tags:函数   点击:(19)  评论:(0)  加入收藏
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  C语言编程    Tags:C语言   点击:(49)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  深度Linux    Tags:C++   点击:(38)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  zls315    Tags:C#   点击:(50)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条