C语言标准库函数

彩虹网

C的标准库与GnuLibc

Unix被产生时,是用汇编写的,汇编有移殖问题和开发效率问题(汇编是任何硬架构上的CPU专用语言),因此Unix的作者又创始了C语言,并改写Unix,所以历史上C是产生在真正的Unix之后的,而且正是跟操作系统的诞生密切相关的,并强烈地服务于系统开发的(C是最初作为UNIX专用系统编程语言出现的,后来发展到通用的系统编程甚至应用开发1).

C的移殖性超好2开发效率良好,这个作者又写了一本书,形成了C语言的第一次标准化3.在系统方面,几乎是Unix产生之后,各种类Unix系统不断出现,,为了规范这些类Unix的兼容性,及对它们之上的基于C的那些开发工作,提出了一个Posix,对系统调用例程接口进行了规范,因此产生了Posixapi规范.然后在这个Posix上发展出了一部分的systemcrt.C的标准库也一步一步发展出来了.

C语言的最初的版本是作者借用了B语言一些理念的,不过C语言强就强在它被大众接受并进

入一系列的标准化进程(第一次民间标准化是C语言的二个创始者K&R写的一本书,上面谈到),

但是在89年的时候出现了C++,C标准一部分停留在C++中,即C89,第二支继续独立发展,发展

出了C99,目前最新的C标准是C99,支持并实现了它的编译器市面上比比皆是.所以,当人们单

独说到C的时候,其实他们指的是C99。c库实际上就是OSapi,但这个osapi不比mfc,qt这样的东西,因为C库要首先是语言的库,然后才是os的库,所以C库的核心就是些io,string等的通用逻辑了

TOC

1库与语言的关系

2C标准库

3C的输入与输出流

库与语言的关系与语言的关系

语言之于系统的关系,就在于:语言扩展系统,比如在开发层面提供新的类型,很多时候,编程其实是一种对编译器逻辑的扩展,比如编程时从内置类型中派生新类型.库与语言的关系,也与之类似:库可以扩展语言。我们在前面谈到编程有实现抽象,建立抽象的过程,和组织抽象,复用抽象的过程,。那么抽象来自哪里呢,除了语言编译器内置的抽象,库级抽象,其实还有平台提供的抽象和编程提供的抽象,我们要分清这些抽象都来自哪里,比如,C语言中,语言版的数组是用语法和语义写出来的,而库逻辑版的数组是扩展出来的

在如上意义上,系统编程的另外一层意义就是对系统抽象进行抽象。移殖就是一个先要确定哪些抽象来自语言哪些抽象来自平台,再封装并处理平台抽象的过程。

库更多指代一种设计过程,而不是实现.因为它是面向为了程序员的复用目的,考虑了应用,语言的一种综合抽象过程.一门语言提供的语法形式不是越多越好,而是越少越好,而它导致的库逻辑可以越多越好(表达力强)

C标准库准库

C的标准库为什么这些小呢?因为C本来就是提倡从一穷二白开始实现的语言,特别是C专注的系统实现领域(C是系统开发的DSL),只需要有限几个函数,比如printf,malloc等.历史上,形成C标准库的历史,就是以“纯

C”为中心(开发OS前,我们是没有库可用的,只有语言本身),仅用语言而不涉及到库,来实现出一个系统的过程,在系统实现后,它形成的头文件,就成为C标准库的原型.即,用C实现系统是仅依赖于语言本身的,而系统实现后,形成的以头文件为代表的可复用单元,就成为最初C语言标准库的原型.

Ansic的标准不仅包括语言,还包括预处理4,以及标准库.这里谈到的标准和标准库,都是指某种概念规范上的东西,因此各种实体5或第三方都有它们的实作,其中以各种编译器,unixlibc6和gnulibc为主(它们当中都包含了stdansiclib的实现,但libc,gnulibc–简称glibc,它们虽然也实现了stdansiclib,但这–为了实现一

现,但libc,gnulibc–简称glibc,它们虽然也实现了stdansiclib,但

个附语言发布的语言标准库不是它们的主要任务和全部任务,因为它们更主要是一种系统开发库,因此还需要包含其它的内容).Linux以前主要采用olderunixlibc7,在libc5之后,逐渐采用gnulibc(沿称为libc6).上面“其它们内容”主要指os系统开发相关的东西.比如posix,svid等等,在libc和glibc中都有实现.Posix与ansistdclib又有一些相重的地方.这因为posix规范中的一部分正是ansistdclib.

你可以这样理解:

posix,svid(面向整个OS规范)

=libc,glibc(一定意义上(posix)svid这些规范的实作品)=stdansiclib+libc,glibc中的oscore部分(面向oscore规范)+libc,glibc中的addons

当然,还有一些不只是针对os系统开发的应用级也提供一些类似libc,glibc的东西,比如gtk中的glib,它与glibc只有一字之差且二者内容相当,但却不是glibc.还有一些libc,glibc的特殊版本,比如uclibc等等.

C的输入与输出流输入与输出流

一门语言本来是没有宿主的,输入输出本来是宿主的概念而非语言的概念,系统编程语言如C,接纳了它,并形成作为本身的一部分,这是系统编程语言的使命,

平台抽象可以与语言抽象结合。比如,

从语言的观点来看,文件可以被做进这门语言作为一种数据类型,当然也可以是C语言这样的open()出来的一个指针.C++版本有个Iostream(Cin,Cout就在里面,实际上C++的IO库很大,是一个复杂的基于对象的模板系统),C也有它的Stdio.h(有InputChar()和Printf()等这样的函数),这是C语言的标准(库)独立于所有的硬件和软件环境,是语言本身的因素,,,一门语言的IO机制是很重要的,比如,JAVA的I/O封装得很完善,,它细分成了多个OO表达的,流,,极大地方便了程序员.

I/O绝非仅仅输入输出这四个字这么简单,首先这是一种语言机制(就跟语言提供异常处理,这样的语言机制的地位一样重要),是关于这种语言对向它输入和由它输出的所有抽象的全部集合,它涉及到一门语言如何处理与系统的交互,如果将用户输入转成该语言写成的程序所用,,如何看待OS,文件,的概念,并发展出一系统概念,如inputsteam,filesteam,等等在PC的架构中,语言是高于OS内核的(一般在一个系统的架构中,开发层是高于内核层的),Windows是用C写的,C有它的I/O,是先于Windows的,一门语言并没有具体的数据类型,,比如unsigh,sign这样的区别是来源,起决定作用的还是硬件(这就是C语言平台相关性的由来),,C语言只是对它们提供了一些名称指代,,比如int在有些机子上是32位在有些机子上是16位,这对考虑一种程序的可移殖性是十分重要的.

在C的眼光中,一些输入输出都是某种流,语言接受用户输入,或者程序进行输出,先以内存作为根据地进行缓种, ,缓冲分为二种,一种是缓冲文件系统(这是C标准的文件系统, ,即不是一次性输入用户数据到程序中,而是输入一次缓冲一次,因此不刷新Flush就看不到最新结果),另一种是非缓冲文件系统(每次输入就完成一绝对的i/o),这是,C把显示器,打引机像成标准输出,把用户输入键盘,想象成标准输入, ,并把它们看成,标准输入出流, , , ,把OS的文件想象成fi lesteam.

—————————————-

1. C一坦被发明,立刻就被用于系统实现(因为,就是根据这个任务写的),作为系统实现语言,这决定了它不需要提供异常机制这样的太面向于开发者的影响c程序执行效率的东西↩

2.这并不表明C是可移殖语言,跟java一样,是相对于具体平台上的可移殖↩

3.此时的C叫K&R C而不叫ANS Ixx C,↩

4.使用word时,可以录制宏,进行一些免重复性的,对word本身的控制工作,这往往是vbscript,这就是用脚本语言辅助应用的潮流,跟SQL是一个道理,因为这类脚本语言,往往是对工具逻辑的调用,这就是将软件应用上升到了脚本编程的境界,是UNIX发展shel l的初衷.是“使用工具的语言”,比如unix下的grep,swd等等,同样,对于C++,有许多的宏,把编译器从工具的眼光来看,这些宏组成了一种“编译器控制语言”↩

5.包括x/open这家掌有unix版权的组织↩

6. C最初是作为unix专用系统语言而出现的,这时的l ibc叫older unixl ibc↩

7.所以,也叫older l inuxl ibc↩

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。