API和库函数有什么区别

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

 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,Crun-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(or 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)链接进来。       

编译时到底哪个C run-time library联入你的程序取决于编译选项:/MD,/ML, /MT,/LD (Use Run-Time Library) 你可以VC中通过以下方法设置选择哪个C run-time library联入你的程序: To find these options in the development environment,click Settings on   the Project menu.Then click the C/C++ tab,and click Code Generation in the Category box.See the Use Run-Time Library drop-down box. 

 从程序可移植性考虑,如果两函数都可完成一种功能,选运行时库函数好,因为各个C编译器的生产商对标准C  Run-time Library提供了统一的支持. 

怎么样链接C运行库,而不需要DllMain()?  MSDN   说可以不实现DLLMAIN(),而链接运行库,怎么弄?  在编译设置中加入   /ENTRY:_CRT_INIT@12   ,或者使用   #pragma #pragma   comment(linker,   "/ENTRY:_CRT_INIT@12")Top

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值