设为首页 加入收藏

TOP

c运行库、c标准库、windows API三者之间的关系和区别(一)
2017-10-13 10:50:36 】 浏览:8363
Tags:运行 标准 windows API 三者 之间 关系 区别

c运行库、c标准库、windows API三者之间的关系和区别

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里面含有初始化代码,还有错误处理代码(例如pide 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-timeLibrary的原因很明显,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 b

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言面试练习题,请编写函数 下一篇使用C语言将pcm数据封装成wav文件..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目