什么是C和C++标准——小白必看
本文简要介绍编写C/C ++应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的。
我已经接触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函数的结构:
1.main的定义,程序启动时调用的函数。
这是另外一个来自与同样标准的摘录,描述了CAPI的成员--fmin函数:
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++。
Mac和iOS版实现
在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了。
其它翻译版本(1)
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和C++标准——小白必看的更多相关文章
- 2019最新WEB前端开发小白必看的学习路线(附学习视频教程)
2019最新WEB前端开发小白必看的学习路线(附学习视频教程).web前端自学之路:史上最全web学习路线,HTML5是万维网的核心语言,标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次 ...
- 小白必看Python视频基础教程
Python的排名从去年开始就借助人工智能持续上升,现在它已经成为了第一名.Python的火热,也带动了工程师们的就业热.可能你也想通过学习加入这个炙手可热的行业,可以看看Python视频基础教程,小 ...
- 全网最详细的新手入门Mysql命令和基础,小白必看!
MySQL简介 什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是 ...
- 353 stars Java项目!Java小白必看!austin介绍 【第一话】
有好几个群友问我为什么最近更新变慢了.工作忙是一方面,另一方面是我更新文章的动力确实下降了.近大半年一直在更新的<对线面试官>系列,到现在已经40篇了. 说实话,当时我更新该系列有很大一部 ...
- vue小白必看的生命钩子函数图解
还有3个钩子并未出现在图上: 1.activated生命周期钩子函数在keep-alive 组件激活时调用,该钩子在服务器端渲染期间不被调用. 2.deactivated生命周期钩子函数在keep-a ...
- Web前端开发的四个阶段(小白必看)
第一阶段:HTML的学习 超文本标记语言(HyperText Mark-up Language 简称HTML)是一个网页的骨架,无论是静态网页还是动态网页,最终返回到浏览器端的都是HTML代码,浏览器 ...
- Git的使用和配置小白必看都是干货,为您解惑
Git安装 首先下载git这个软件,然后打开码云新建仓库 在本地选择一个路径作为本地仓库 点新建仓库然后输入邮箱和密码,然后进行配置 在要作为本地仓库的地方新建一个文件夹,保存后关闭,在文件夹空白处鼠 ...
- 小白必看的Python爬虫流程
定义: 网络爬虫(Web Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本. 简介: 网络蜘蛛是一个很形象的名字.如果把互联网比喻成一个蜘蛛网,那么Spider ...
- Python自学从入门到就业之函数基础(小白必看)
函数介绍 <1>什么是函数 请看如下代码: print(" _ooOoo_ ") print(" o8888888o ") print(" ...
随机推荐
- 哪些方法可以绕过PowerShell Execution Policy?
哪些方法可以绕过PowerShell Execution Policy? 转: https://blog.csdn.net/qq_27446553/article/details/50577296
- LongAccumulator类的BUG——reset方法并不能保证初始值正确赋值
LongAccumulator.reset方法并不能重置重置LongAccumulator的identity:初始值正确,使其恢复原来的初始值.当初始值为0是不会发生这个问题,而当我们设置初始值如1时 ...
- (超详细)动手编写 — 栈、队列 ( Java实现 )
目录 前言 栈 概念 栈的设计 编码实现 小结 队列 概念 队列的设计 编码实现 双端队列 概念 设计 编码 循环队列 循环队列 循环双端队列 声明 前言 栈 概念 什么是栈? **栈 **:是一种特 ...
- ES 实现实时从Mysql数据库中读取热词,停用词
IK分词器虽然自带词库 但是在实际开发应用中对于词库的灵活度的要求是远远不够的,IK分词器虽然配置文件中能添加扩展词库,但是需要重启ES 这章就当写一篇扩展了 其实IK本身是支持热更新词库的,但是需要 ...
- 学习 | 基于require.js的三级联动菜单【入门】
主要目的是学习如何使用require.js AMD就是通过延迟和按需加载来解决各个模块的依赖关系,其中require就是AMD的框架之一 它的优点是可以解决以下问题: JS文件的依赖关系. 通过异步加 ...
- zookeeper源码之服务端
zookeeper服务端主要包括一下几个模块: 1.启动模块. 2.核心执行模块 3.数据管理模块. 启动模块 读取配置文件,启动程序.详见:zookeeper源码之服务端启动模块. 核心执行 ...
- CVE-2020-0796(Windows SMBv3) RCE漏洞复现
CVE-2020-0796 攻击机:win10:192.168.205.1 靶机win10:192.168.205.132 关闭defender防火墙 0x01 影响版本 Windows 10 190 ...
- VUE3.0发布,自己搞个文档网站
9月19日,尤大神发表了VUE3.0版本的演说,强大且震撼,这两天一直在找网站文档,可能还未被百度收录,未找到文档网站.后来在github上面找到了中文代码. 地址为:https://github.c ...
- 你来讲讲AQS是什么吧?都是怎么用的?
前言 在Java面试的时候,多线程相关的知识是躲不掉的,肯定会被问.我就被问到了AQS的知识,就直接了当的问,AQS知道是什么吧,来讲讲它是怎么实现的,以及哪些地方用到了它.当时自己确实没有讲好,所以 ...
- 使用Commons FileUpload 1.3.3和Servlet 3.0上传文件
简介 Commons FileUpload可以轻松地为web应用程序添加强大,高性能的文件上传功能.Servlet3.0之前的web应用程序需要使用Commons FileUpload组件上传文件,但 ...