简要介绍编写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等等,数字与出版/发布年份相符。

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

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

● 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了。

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++编程学习基地【点击进入】!

还有(源码,零基础教程,项目实战教学视频)!带你入个门还是简简单单啦~

涉及:游戏开发、课程设计、常用软件开发、编程基础知识、黑客等等...

 

 

什么是 C 和 C ++ 标准库?学编程的你应该知道这些知识!的更多相关文章

  1. 【循序渐进学Python】11.常用标准库

    安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...

  2. 【夯实PHP基础】PHP标准库 SPL

    PHP SPL笔记 这几天,我在学习PHP语言中的SPL. 这个东西应该属于PHP中的高级内容,看上去很复杂,但是非常有用,所以我做了长篇笔记.不然记不住,以后要用的时候,还是要从头学起. 由于这是供 ...

  3. python学习笔记系列----(八)python常用的标准库

    终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...

  4. 【转】C++标准库和标准模板库

    C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...

  5. C++标准库和标准模板库

    转自原文http://blog.csdn.net/sxhelijian/article/details/7552499 C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标 ...

  6. C++著名类库和C++标准库介绍

    C++著名类库 1.C++各大有名库的介绍——C++标准库 2.C++各大有名库的介绍——准标准库Boost 3.C++各大有名库的介绍——GUI 4.C++各大有名库的介绍——网络通信 5.C++各 ...

  7. C++标准库和标准模板库(转)

    转自原文http://blog.csdn.net/sxhelijian/article/details/7552499 C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标 ...

  8. c++ io标准库2

    转自:http://www.2cto.com/kf/201110/109445.html 接下来我们来学习一下串流类的基础知识,什么叫串流类? 简单的理解就是能够控制字符串类型对象进行输入输出的类,C ...

  9. PHP标准库 SPL

    PHP SPL笔记 这几天,我在学习PHP语言中的SPL. 这个东西应该属于PHP中的高级内容,看上去很复杂,但是非常有用,所以我做了长篇笔记.不然记不住,以后要用的时候,还是要从头学起. 由于这是供 ...

随机推荐

  1. Odoo10.0中的工作流

    Odoo10.0中可以通过两种方式来实现工作流(workflow) 一种的官网API中给出的方式,链接:https://www.odoo.com/documentation/10.0/referenc ...

  2. 修改mysql、sqlserver数据库默认用户,不允许为root、sa等

    1.mysql cmd进入dos命令,输入mysql -u root -P 1202 -h localhost -p敲回车输入密码 use mysql; 修改用户名root为其他用户 update u ...

  3. sqli-labs 1-10关

    学习sql注入的必做靶场我终于来尝试一下下了. 第一关 ?id=1'时出现 在测试?id=1' and '1'='1,页面正常 ?id=1' and '1'='2  页面错误 判断存在单引号字符型注入 ...

  4. PhpStorm license server(版权许可服务器)在线激活服务器集群列表

    原文链接:https://bingyishow.top/easy/55.html 服务器列表 序号 服务器(域名) 状态 1 http://www.yuanzhaoyi.cn 在线 2 http:// ...

  5. [LeetCode]15. 三数之和(数组)(双指针)

    题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  6. [Java并发编程之美]第2章 synchroized关键字

    ###synchronized关键字 synchronized块是Java提供的一种原子性内置锁,每个对象都可以把它当同步锁来用.线程在进入synchronized块钱会自动获取内部锁,这时候其他线程 ...

  7. 如何成为一位优秀的ScrumMaster

    嗨,大家好,我是叶子 背景介绍 目标:为了能更好的适应快速变化的需求和不确定的未来. 部门包含岗位:部门负责人.项目经理.产品经理.开发团队(开发人员.测试人员) 那么这种情况下,我们想转型Scrum ...

  8. 学习使用PSTools工具中的psping

    目录 初识PsTools psping 1.使用ICMP ping 2.使用TCP ping 3.延迟测试 4.带宽测试 5.同功能的tcping工具 总结 初识PsTools     在工作中我们都 ...

  9. StarUML 3.1.0 for Windows 10

    StarUML 3.1.0 for Windows 10 1.下载 StarUML 3.1.0 http://staruml.io/download 2.安装 npm 到官网下载安装 windows版 ...

  10. Anaconda简介及特点

    摘要 Python是一种面向对象的解释型计算机程序设计语言,其使用,具有跨平台的特点,可以在Linux.macOS以及Windows系统中搭建环境并使用,其编写的代码在不同平台上运行时,几乎不需要做较 ...