首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问关于C Run-time library

2013-10-14 
请教关于C Run-time library半路出家,对标准C Run-time library一直很困惑,向大家请教.以下为我的理解和困

请教关于C Run-time library
半路出家,对标准C Run-time library一直很困惑,向大家请教.

以下为我的理解和困惑:
C Run-time library (CRT)是不是也有公开的标准,就好比C/C++也有标准一样,具体的实现,是由各个厂商自己去做的,如微软有自己的CRT,Borland也有自己的CRT,只是他们都遵循统一的标准.
或者不存在这样的公开的统一标准,各家厂商只是自己的开发,但很多Common routines的功能显然应该是一样的.

CRT是不是与平台无关,即我的程序如果使用CRT,在不同的平台只需要重新编译即可,不需要修改源代码.好比,c与平台无关的概念一样.
[解决办法]
CRT一般是由OS或Compiler实现的,各公司遵循相同的标准(ANSI C),自己实现CRT,但可能会自己增加新的功能、函数

的确与平台无关,但是对于那些厂商自己增添的函数要去掉,只需重新编译即可
[解决办法]
C语言标准(不管是ANSI 还是ISO)包含2部分,一部分是语言本身的标准,另一部分是C标准函数库。C标准函数库规定了函数的原型和功能,但是并没限定这些函数要怎么实现。所谓满足标准C规定的C编译器,不仅指这个编译器满足C语言本身的标准,还指这个编译器提供了一组满足C标准库的库函数。这组库函数是由编译器厂商实现,并且满足标准C规定的功能和接口的。这些库函数,厂商并不一定要提供给用户源文件给用户编译用,可以是二进制目标文件给用户链接用(我猜这就是叫着运行库的原因之一,你看不到源码,能看到运行是的汇编码)。
所以说,不管是哪个厂商的CRT,只要他宣称他是标准的C编译器,那他的CRT就肯定是满足C标准中关于C标准库的规定。厂商除了还可以对自己的CRT进行扩展,因此,是CRT中包含了标准C库,而不是C库中包含了CRT。

同时还应该说明,C库函数里的有些函数需要操作系统支持才能实现的,比如printf和scanf函数等,这些函数管理输入和输出,但实际函数的底层是调用了操作系统提供的接口函数(实际就是系统调用)和实际的输入输出设备打交道(我猜这是叫C运行库的另外一个原因,它的某些功能要运行在操作系统的支持之上)。

大概你又要迷惑为什么又牵涉进来操作系统了。简单的讲,操作系统就是管理计算机软硬件资源,并为上层应用提供统一系统调用接口的一组程序。操作系统为我们管理千差万别的硬件,并为上层(这里是CRT)提供统一的系统调用接口。举例来说:输入设备千差万别:有串口,鼠标,键盘,触摸屏等等,由操作系统管理这些输入设备的差别,然后提供给scanf提供一个系统调用来得容易还是由C标准自己规定遇到每种不同的输入设备应该怎么动作来得容易?
[解决办法]
CRT是平台相关的,但在构建编译器时都会解析到相关的CRT,这个不用你担心。
STL要链接到CRT,没CRT,啥都玩不转,除非你自己用平台api自己搞一套。
[解决办法]
唉,C++的东西我不懂。不过可以再描述下C标准库和C运行库。
我们在实际中说某个企业满足ISO9001之类的标准,实际就是用这个标准中的东西去检验这个企业,如果企业都符合标准了,那就是满足。
这个ISO9001就相当于C标准库,而这个企业就相当于C运行库。C标准库并不是实实在在存在的东西,只是规定了你这个企业应该具备些什么条件。
C标准库是一种标准,C运行库是一种实现。也就是说,实际存在的是C运行库,这个运行库满足C标准库里规定的所有东西,而不存在C标准库。
同样的,C++标准库应该也是只规定了一系列标准,而并不是实现。而STL则是满足C++标准库的一种实现。
那现在不管什么CRT和STL了,只看C标准库和C++标准库这2个标准。c++是C的超集,C里能用的东西基本C++里也有。因此结果应该是:C++标准库包含了C标准库的所有东西,并根据C++面向对象的特点做了扩展。
可以把C标准库的由来看成是这样的:以前好几个C编译器,这些编译器各自提供了一组常用的函数集合(库函数)。这样每个C编译器都有一组C库函数,如果用户换了编译器,就需要重新去记忆另外一个编译器提供的库函数。这显然是不利于C的推广的,所以C标准委员会就在这些编译器提供的库函数里面抽出公共的部分作为一个标准库(只取了函数原型,并没规定函数怎么实现),并规定以后每个满足C标准的编译器都应该提供相应相同的公共部分(相同的函数原型)。这样子用户就方便了,只要这个编译器说他满足C标准,那他就肯定实现了规定C标准库里的那些函数。编译器厂商也方便了,因为他只需要把C标准库里规定要实现的东西都实现了,而不用去想需要提供哪些常用函数。
[解决办法]

引用:
引用:
唉,C++的东西我不懂。不过可以再描述下C标准库和C运行库。
我们在实际中说某个企业满足ISO9001之类的标准,实际就是用这个标准中的东西去检验这个企业,如果企业都符合标准了,那就是满足。
这个ISO9001就相当于C标准库,而这个企业就相当于C运行库。C标准库并不是实实在在存在的东西,只是规定了你这个企业应该具备些什么条件。
C标准库是一种标准……


源码级可以,也就是说源代码不用修改就可以在新平台上用新编译器直接编译出目标代码使用。
但是重新编译这是必须的。
[解决办法]
貌似大家将LIBC和CRT混为一谈了:)
运行库还有一个很大的功能,就是将程序运行环境搭起来,比如把堆、栈、环境变量、I/0等等准备好,然后调用我们的main函数。
在我们的main被执行之前,CRT已经做和很多工作。没有CRT,我们的main就跑不起来。

热点排行