您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

c运行库、c标准库、windows API的区别和联系

时间:2019-04-17 09:26:16  来源:  作者:
C运行时库函数

C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的。

API函数

API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的。

区别

他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的。

·1、运行时库就是 C run-time library,是C而非C++语言世界的概念。

取这个名字就是因为你的C程序运行时需要这些库中的函数。

·2、C语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等);

所以,C语言内核开发出来之后,Dennis Ritchie和Brian Kernighan就用C本身重写了90%以上的UNIX系统

函数,并且把其中最常用的部分独立出来,形成头文件和对应的LIBRARY,C run-time Library就是这样

形成的。

·3、随后,随着C语言的流行,各个C编译器的生产商/个体/团体都遵循老的传统,在不同平台上都有相对应

的Standard Library,但大部分实现都是与各个平台有关的。由于各个C编译器对C的支持和理解有很多

分歧和微妙的差别,所以就有了ANSI C;ANSI C(主观意图上)详细的规定了C语言各个要素的具体含义

和编译器实现要求,引进了新的函数声明方式,同时订立了Standard Library的标准形式。所以C运行时

库由编译器生产商提供。至于由其他厂商/个人/团体提供的头文件和库函数,应当称为第三方C运行库

(Third party C runtime libraries)。

·4、C run-time library里面含有初始化代码,还有错误处理代码(例如divide by zero处理)。你写的程序

可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C run-time库,mAIn()

就不会被调用,exit()也不能被响应。因为 C run-time Library 包含了C程序运行的最基本和最常用的

函数。

·5、到了C++世界里,有另外一个概念:Standard C ++ Library,它包括了上面所说的C run-time Library

和STL。包含C run-time Library的原因很明显,C++是C的超集,没有理由再重新来一个C++ run-time

Library。VC针对C++加入的Standard C ++ Library主要包括:LIBCP.LIB、LIBCPMT.LIB和MSVCPRT.LIB。

·6、windows环境下,VC提供的 C run-time Library又分为动态运行时库和静态运行时库。

动态运行时库

动态运行时库主要包括:

·DLL库文件:msvcrt.dll(或 MSVCRTD.DLL for debug build)

·对应的Import Library文件:MSVCRT.LIB(或 MSVCRTD.LIB for debug build)

静态运行时库

静态运行时库(release版)对应的主要文件包括:

·LIBC.LIB(Single thread static library, retail version)

·LIBCMT.LIB(Multithread static library, retail version)

msvcrt.dll提供几千个C函数,即使是像printf这么低级的函数都在msvcrt.dll里。其实你的程序运行时,很大一部分时间是在这些运行库里运行。在你的程序(release版)被编译时,VC会根据你的编译选项(单线程、多线程或DLL)自动将相应的运行时库文件(libc.lib、libcmt.lib或Import Library msvcrt.lib)链接进来。

2.C运行时库的作用

C运行时库除了给我们提供必要的库函数调用(如memcpy、printf、malloc等)之外,它提供的另一个最重要的功能是为应用程序添加启动函数。

C运行时库启动函数的主要功能为进行程序的初始化,对全局变量进行赋初值,加载用户程序的入口函数。

不采用宽字符集的控制台程序的入口点为mainCRTStartup(void)。下面我们以该函数为例来分析运行时库究竟为我们添加了怎样的入口程序。这个函数在crt0.c中被定义,下列的代码经过了笔者的整理和简化:

void mainCRTStartup(void)

{

 int mainret;

 /*获得WIN32完整的版本信息*/

 _osver = GetVersion();

 _winminor = (_osver >> 8) & 0x00FF ;

 _winmajor = _osver & 0x00FF ;

 _winver = (_winmajor << 8) + _winminor;

 _osver = (_osver >> 16) & 0x00FFFF ;

 _ioinit(); /* initialize lowio */

 /* 获得命令行信息 */

 _acmdln = (char *) GetCommandLineA();

 /* 获得环境信息 */

 _aenvptr = (char *) __crtGetEnvironmentStringsA();

 _setargv(); /* 设置命令行参数 */

 _setenvp(); /* 设置环境参数 */

 _cinit(); /* C数据初始化:全局变量初始化,就在这里!*/

 __initenv = _environ;

 mainret = main( __argc, __argv, _environ ); /*调用main函数*/

 exit( mainret );

}

从以上代码可知,运行库在调用用户程序的main或WinMain函数之前,进行了一些初始化工作。初始化完成后,接着才调用了我们编写的main或WinMain函数。只有这样,我们的C语言运行时库和应用程序才能正常地工作起来。

除了crt0.c外,C运行时库中还包含wcrt0.c、 wincrt0.c、wwincrt0.c三个文件用来提供初始化函数。wcrt0.c是crt0.c的宽字符集版,wincrt0.c中包含 windows应用程序的入口函数,而wwincrt0.c则是wincrt0.c的宽字符集版。

Visual C++的运行时库源代码缺省情况下不被安装。如果您想查看其源代码,则需要重装Visual C++,并在重装在时选中安装运行库源代码选项。

 下面看一个未正确使用C运行时库的控制台程序:

#include

#include

int main()

{

 CFile file;

 CString str("I love you");

 TRY

 {

file.Open("file.dat",CFile::modeWrite | CFile::modeCreate);

 }

 CATCH( CFileException, e )

 {

#ifdef _DEBUG

afxDump << "File could not be opened " << e->m_cause << " ";

#endif

 }

 END_CATCH

 file.Write(str,str.GetLength());

 file.Close();

}

我们在"rebuild all"的时候发生了link错误:

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

main.exe : fatal error LNK1120: 2 unresolved externals

Error executing cl.exe.

发生错误的原因在于Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程。我们只需要在Visual C++6.0中依次点选Project->Settings->C/C++菜单和选项,在Project Options里修改编译选项即可。

C运行库和C标准库的关系
C标准库,顾名思义既然是标准,就是由标准组织制定的。是由“美国国家标准协会(American National Standards Institute,ANSI)”为了规范C语言库而制定的标准。在最初,各个大学各个公司使用的C语言库都不尽相同,造成相互移植非常困难,在这个背景下,制定了这个标准。

C运行库,是和平台相关的,即和操作系统相关的。它由不同操作系统不同开发平台提供不同的C运行库。但是C运行库的部分实现是基于C标准库的,即C运行库是各个操作系统各个开发工具根据自身平台开发的库,某种程度上,可以说C运行库是C标准库的一个扩展库,只是加了很多C标准库所没有的与平台相关的或者不相关的库接口函数。举例子如:c标准库的strcpy函数负责字符串的拷贝,但是由于缺少对目地字符串缓冲区大小的控制,极有可能导致缓冲区溢出(大量的缓冲区溢出攻击都是由于这种漏洞而产生的);相反,Windows提供了能够实现同样功能的安全的字符串拷贝函数,减少了缓冲区攻击的可能,strcpy_s。这些函数是以c运行库的方式提供的,当然,不同的操作系统,c运行时库可能不同,但是对c标准库的支持是完全一致的,也就是说,在不同的操作系统上,使用同一个c标准库的函数必然产生一致的结果。

C标准库中提供的有:

l 标准输入输出(stdio.h)。

l 文件操作(stdio.h)。

l 字符操作(ctype.h)。

l 字符串操作(string.h)。

l 数学函数(math.h)。

l 资源管理(stdlib.h)。

l 格式转换(stdlib.h)。

l 时间/日期(time.h)。

l 断言(assert.h)。

l 各种类型上的常数(limits.h & float.h)。

你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C run-time库,main()就不会被调用,exit()也不能被响应。因为C run-time library包含了C程序运行的最基本和最常用的函数。

如下是C运行库与C标准库的关系:

一个C运行库大致包含了如下功能:

l 启动与退出:包括入口函数及入口函数所依赖的其他函数等。

l 标准函数:由C语言标准规定的C语言标准库所拥有的函数实现。(C标准库)

l I/O:I/O功能的封装和实现,参见上一节中I/O初始化部分。

l 堆:堆的封装和实现,参见上一节中堆初始化部分。

l 语言实现:语言中一些特殊功能的实现。

l 调试:实现调试功能的代码。

操作系统API和C运行库CRT,C标准库之间区别
首先,C语言要早于Windows出现,而且C语言实际标准制定的开始时间也要早于Windows(API概念出现的)系统的开发时间。所以Windows系统在开发的时候是完全可以使用C语言的。目前最多的说法是用C和汇编实现的。那么只要用C,就可能用C标准库。

我们假设两种情况,一是Windows API的实现包含部分C标准库函数的功能实现,这就决定了这部分操作系统API的实现是由调用标准库实现的,那么在发布时需要加入所用到的c标准库DLL一同发布。

二是微软的内核(包括API)开发是使用着一个和平台严格相关的C语言的静态的链接库,这样不必提供Dll也能开发和发行。而且必然的这个C库是在汇编的基础上实现的,也就是说这个库里面的C函数都是(至少有很大比例)披着C语法的汇编代码。

要你是微软,你选择哪个呢?也许是两者兼而有之,也许是后者。

一般情况下,我们说C运行库暗含的意思是哪种平台哪个开发平台的C运行库,

CRT的实现是基于Windows API的,而WindowsAPI的开发也是基于C语言的,但不是或者不一定基于CRT(或者C标准库)的。

再深一步,虽然CRT是基于操作系统 API实现的,但并不代表所有的CRT封装了操作系统 API,如一些用户的权限控制,操作系统线程创建等都不属于C运行库,于是对于这些操作我们就不得不直接调用操作系统API或者其他库。

总结一下,C标准库就是任何平台都可以使用的基本C语言库。而CRT除了将C标准库加入所属范围外,还扩展了与平台相关的接口库,这些接口实现根据不同平台调用不同平台的操作系统API。

如下图所示,采用C标准库编写的程序可以应用到windows平台,也可以应用到linux平台;而用CRT另外与平台相关的库函数编写的应用程序不能跨平台运行。

而不同平台的操作系统API实现,是用C标准库呢,还是汇编呢,这个可有,可没有。毕竟那么多windows API只要发现一个调用C标准库的了,就有了。概念理解了即可,至于微软实现的时候基于何种考虑不使用C标准库,或者使用C标准库都有自己的考虑。那就是操作系统内部的研究范围了。

 


Tags:   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Create 2024百度AI开发者大会:李彦宏带来三大AI开发工具,让人人都是开发者
“未来,自然语言将成为新的通用编程语言,你只要会说话,就可以成为一名开发者,用自己的创造力改变世界。”4月16日,Create 2024百度AI开发者大会在深圳举办。百度创始人、董事长兼...【详细内容】
2024-04-17  Search: C语言  点击:(2)  评论:(0)  加入收藏
“刘强东”当主播,扶得起京东直播吗?
定焦(dingjiaoone)原创作者 | 苏琦编辑 | 金玙璠“东哥呢,在哪里?”4月16日下午6点18分,刘强东的数字人形象“采销东哥”开启“直播首秀”,同时亮相京东家电家居、京东超市采销直...【详细内容】
2024-04-17  Search: C语言  点击:(2)  评论:(0)  加入收藏
AI圈公开的秘密:天下模型一大抄
抄袭已经成为AI世界公开的秘密。据The Information周一的文章,许多初创公司的AI聊天机器人很可能是采用了OpenAI和其他公司的数据开发的。这些机器人在某些任务上可以媲美GPT...【详细内容】
2024-04-17  Search: C语言  点击:(4)  评论:(0)  加入收藏
聚焦“一房二卖”等问题 最高检发布典型案例
记者4月16日从最高人民检察院获悉,最高检近日印发了6件涉房地产纠纷民事检察监督典型案例,聚焦“一房二卖”、逾期办理产权证、违约金调整等高发监督事项。“一房二卖”等违法...【详细内容】
2024-04-17  Search: C语言  点击:(2)  评论:(0)  加入收藏
今年买二手房最划算?70城二手房价格全都降了!
国家统计局4月16日公布的数据显示,2024年一季度,全国房地产开发投资同比下降9.5%。从销售来看,一季度,销售面积同比下降19.4%;新建商品房销售额下降27.6%。国家统计局城市司首席...【详细内容】
2024-04-17  Search: C语言  点击:(1)  评论:(0)  加入收藏
周鸿祎力挺手机支架 喊话余承东:手机在老婆手里 你能专心开车吗
快科技4月17日消息,360周鸿祎近日再次提及了雷军和余承东引发的关于手机支架的讨论,强调了手机支架与驾驶安全之间的关联。周鸿祎认为,余承东在智界S7发布会上对手机支架的讽刺...【详细内容】
2024-04-17  Search: C语言  点击:(1)  评论:(0)  加入收藏
Android 15 有望引入应用隔离功能,进一步提升系统安全性
IT之家 4 月 17 日消息,即将推出的 Android 15 系统可能引入一项全新功能:应用隔离。这一功能将更好地保护用户免受行为异常应用的侵害。Android 系统一直拥有强大的安全防护...【详细内容】
2024-04-17  Search: C语言  点击:(4)  评论:(0)  加入收藏
全球首个AI程序员Devin造假?业内人士:质疑有理,但程序员已离不开AI
&middot;号称全球首个AI人工智能软件师Devin日前被网络博主质疑造假、炒作。业内人士分析认为,该位博主质疑有理有据,Devin的“惊人效果”确实存在一些商业炒作的嫌疑。号称“...【详细内容】
2024-04-17  Search: C语言  点击:(2)  评论:(0)  加入收藏
“刘强东”直播首秀,释放了什么信号?
文|新浪科技 原祎鸣“3!2!1!上链接!”昨晚,刘强东AI数字人(以下简称“刘强东”)完成了首秀。虽然此前已有不少明星、头部主播的“分身”活跃在直播间中,技术制造的“替代者”已不算...【详细内容】
2024-04-17  Search: C语言  点击:(2)  评论:(0)  加入收藏
A股突发!美联储传来大消息
全球市场动荡的根源其实还在于美元!最近,全球股债基本处于双杀状态,昨天A股亦是惨烈。在这种市场情绪背后,有人错误将之归咎于资本市场新规,其实根源在于美元,因为全球主要资产几...【详细内容】
2024-04-17  Search: C语言  点击:(2)  评论:(0)  加入收藏
▌简易百科推荐
C++中的外部模板及其在当前编译文件中的实例化
在C++中,模板是一种泛型编程的工具,它允许程序员以一种类型无关的方式编写代码。然而,模板的一个常见问题是它们会导致编译时间增加,特别是在大型项目中,当多个源文件包含相同的...【详细内容】
2024-04-11  鲨鱼编程  微信公众号  Tags:C++   点击:(9)  评论:(0)  加入收藏
C++常见避坑指南
C++ 从入门到放弃?本文主要总结了在C++开发或review过程中常见易出错点做了归纳总结,希望借此能增进大家对C++的了解,减少编程出错,提升工作效率,也可以作为C++开发的避坑攻略。...【详细内容】
2024-04-03  腾讯技术工程    Tags:C++   点击:(8)  评论:(0)  加入收藏
C++ 之父反驳白宫警告:自诞生第一天起,C++ 的目标就一直是提高安全性
整理 | 郑丽媛上个月,美国白宫国家网络主任办公室(ONCD)在一份主题为《回到基础构件:通往安全软件之路》的 19 页 PDF 报告中,呼吁开发人员停止使用容易出现内存安全漏洞的编程语...【详细内容】
2024-03-25    CSDN  Tags:C++   点击:(9)  评论:(0)  加入收藏
八个 C++ 开源项目,帮助初学者进阶成长
通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。1.ThreadPool一个简单的 C++1...【详细内容】
2024-03-22  AI让生活更美好  微信公众号  Tags:C++   点击:(27)  评论:(0)  加入收藏
C# 中15个值得收藏的开源项目推荐
在开源的世界里,C# 编程语言也占有一席之地。这些开源项目涵盖了多个领域,从框架、库到工具,它们为C#开发者提供了丰富的资源和工具,帮助他们更高效地开发、测试和部署应用程序...【详细内容】
2024-03-20  程序员编程日记  微信公众号  Tags:C#   点击:(33)  评论:(0)  加入收藏
C#异步编程:Task.Run vs. async-await,掌握基础与高级用法
概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-await更适用于清晰表达异步流程。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使...【详细内容】
2024-03-09  架构师老卢  今日头条  Tags:C#   点击:(33)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03     AI让生活更美好  Tags:C++   点击:(76)  评论:(0)  加入收藏
C++代码优化攻略
今天我们将深入探讨C++性能优化的世界。在当今软件开发的浪潮中,高性能的代码是必不可少的。无论是开发桌面应用、移动应用,还是嵌入式系统,性能都是关键。1. 选择合适的数据结...【详细内容】
2024-01-26  AI让生活更美好  微信公众号  Tags:C++   点击:(124)  评论:(0)  加入收藏
C# 线程本地存储为什么线程间值不一样
为什么用 ThreadStatic 标记的字段,只有第一个线程拿到了初始值,其他线程都是默认值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给后面类...【详细内容】
2024-01-26  一线码农聊技术  微信公众号  Tags:C#   点击:(76)  评论:(0)  加入收藏
C++质数检测器的设计与实现​
质数,作为数学中的一个基本概念,一直以其独特的性质吸引着众多研究者和爱好者。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。在实际应用中,质数检测也扮演着...【详细内容】
2024-01-15  鲨鱼编程  微信公众号  Tags:C++   点击:(123)  评论:(0)  加入收藏
站内最新
站内热门
站内头条