初学C那会儿,还不知道C语言运行时库(CRT)的概念,以为C是和平台无关的,也就是说Windows API是调用了C的函数实现的。到了后来却发现根本不是那么回事,反而呢是C函数库里面的一些函数调用的WindowsAPI实现的。这个时候我的认知遭到了颠覆,自然而然的就想彻底搞明白CRT和Windows API到底是个什么关系!
百度了一下,有一篇文章介绍的还是比较详细的:
http://hi.baidu.com/glorysnow/blog/item/b38daf8bbafb877d9e2fb4d8.html
这篇文章最后的结论是:CRT(Microsoft's C/C++ Runtime Library)的一个真子集(主要是C++Runtime Library)是一个符合(或至少是企图符合)C++标准的C++库。而WindowsAPI(以及Windows的其他许多部分)都是在CRT的基础上开发的。
也就是说Windows API是基于CRT实现的。这和我现在的想法是相反的,我想我还是自己解释一遍给自己听吧!
首先,C语言要早于Windows出现,而且C语言实际标准制定的开始时间[1]也要早于Windows(API概念出现的[2])系统的开发时间。所以Windows系统在开发的时候是完全可以使用C语言的。
然而在C语言最早的标准制定的时候可能并未严格区分平台和非平台。因为那个时候Windows还没有出现,都是类Unix系统,所以即使是平台相关的在那个时候也想当然的被理解为平台不相关的。当Windows系统出现之后,由于采用了和类Unix系统不一样的实现的新的文件管理模块、新的进程线程管理模块等和平台有严格关联的模块,导致了CRT在概念上就严格区分了平台相关和平台不相关。和平台不相关的部分,如字符串处理函数、数学计算函数等;和平台相关的部分,如文件操作函数、线程操作函数、输入输出函数等。
最新的C标准中又引入了本地化的概念,这在CRT中也有体现。当用到本地化的时候,CRT的字符串处理函数却是调用了系统的API函数。这样就导致了CRT几乎所有模块的实现都依赖于系统的API了。
而一旦严格区分了平台相关和平台不相关,CRT和API的关系就不是一句两句就能说清楚的了。API的开发的确是可以基于C语言的,但是由于平台相关模块的存在,就使得API开发的时候可以使用的C语言模块相当有限了。所以如果我们抱着Windows API的开发也必须使用微软提供给程序员开发的CRT版本上的想法,那么我们就是大错特错了。在我看来,微软的内核(包括API)开发应该是使用着一个和平台严格相关的C语言的静态的链接库,这样不必提供Dll也能开发和发行。而且必然的这个C库是在汇编的基础上实现的,也就是说这个库里面的C函数都是(至少有很大比例)披着C语法的汇编代码。如果我们想通了微软提供给程序员开发的CRT版本并不是微软开发内核使用的版本,那么CRT和API的关系也就能很容易就理解了。
随着各种操作系统的发展,包括前面提到的本地化等新概念在C语言的加入,C语言变得越来越像一个脱离操作系统层次的提供给程序员实现源代码层次的平台不相关的语言框架。但是C语言仍然可以用来开发系统内核,因为C语言的语法在层次上要比汇编高级,但是这个时候的C语言就不是程序员通常使用的CRT版本了,而是看起来就像是一个披着C语言外衣的汇编代码库了。
这样,我们就可以说,CRT的实现是基于Windows API的,而WindowsAPI的开发也是基于C语言的但是不是基于CRT的。
[1]1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE CPROGRAMMING LANGUAGE”一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C 语言,后来由美国国家标准协会(AmericanNational Standards Institute)在此基础上制定了一个C语言标准,于一九八三年发表。通常称之为ANSIC。
[2]WindowsAPI 就是windows应用程序接口,是针对microsoftwindows操作系统家族的系统编程接口,这样的系统包括Windows7,Windows Vista、WindowsXP、WindowsServer 2003、Windows2000、Windows95、Windows 98、Windows Me(Millennium Editon)和Windows CE等几乎所有版本。