亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

C運(yùn)行時(shí)庫函數(shù)

C運(yùn)行時(shí)庫函數(shù)是指C語言本身支持的一些基本函數(shù),通常是匯編直接實(shí)現(xiàn)的。

API函數(shù)

API函數(shù)是操作系統(tǒng)為方便用戶設(shè)計(jì)應(yīng)用程序而提供的實(shí)現(xiàn)特定功能的函數(shù),API函數(shù)也是C語言的函數(shù)實(shí)現(xiàn)的。

區(qū)別

他們之間區(qū)別是:API函數(shù)是針對操作系統(tǒng)的,C語言運(yùn)行時(shí)函數(shù)則是針對C語言本身的。

·1、運(yùn)行時(shí)庫就是 C run-time library,是C而非C++語言世界的概念。

取這個(gè)名字就是因?yàn)槟愕腃程序運(yùn)行時(shí)需要這些庫中的函數(shù)。

·2、C語言是所謂的“小內(nèi)核”語言,就其語言本身來說很小(不多的關(guān)鍵字,程序流程控制,數(shù)據(jù)類型等);

所以,C語言內(nèi)核開發(fā)出來之后,Dennis Ritchie和Brian Kernighan就用C本身重寫了90%以上的UNIX系統(tǒng)

函數(shù),并且把其中最常用的部分獨(dú)立出來,形成頭文件和對應(yīng)的LIBRARY,C run-time Library就是這樣

形成的。

·3、隨后,隨著C語言的流行,各個(gè)C編譯器的生產(chǎn)商/個(gè)體/團(tuán)體都遵循老的傳統(tǒng),在不同平臺上都有相對應(yīng)

的Standard Library,但大部分實(shí)現(xiàn)都是與各個(gè)平臺有關(guān)的。由于各個(gè)C編譯器對C的支持和理解有很多

分歧和微妙的差別,所以就有了ANSI C;ANSI C(主觀意圖上)詳細(xì)的規(guī)定了C語言各個(gè)要素的具體含義

和編譯器實(shí)現(xiàn)要求,引進(jìn)了新的函數(shù)聲明方式,同時(shí)訂立了Standard Library的標(biāo)準(zhǔn)形式。所以C運(yùn)行時(shí)

庫由編譯器生產(chǎn)商提供。至于由其他廠商/個(gè)人/團(tuán)體提供的頭文件和庫函數(shù),應(yīng)當(dāng)稱為第三方C運(yùn)行庫

(Third party C runtime libraries)。

·4、C run-time library里面含有初始化代碼,還有錯誤處理代碼(例如divide by zero處理)。你寫的程序

可以沒有math庫,程序照樣運(yùn)行,只是不能處理復(fù)雜的數(shù)學(xué)運(yùn)算,不過如果沒有了C run-time庫,main()

就不會被調(diào)用,exit()也不能被響應(yīng)。因?yàn)?C run-time Library 包含了C程序運(yùn)行的最基本和最常用的

函數(shù)。

·5、到了C++世界里,有另外一個(gè)概念:Standard C ++ Library,它包括了上面所說的C run-time Library

和STL。包含C run-time Library的原因很明顯,C++是C的超集,沒有理由再重新來一個(gè)C++ run-time

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

·6、windows環(huán)境下,VC提供的 C run-time Library又分為動態(tài)運(yùn)行時(shí)庫和靜態(tài)運(yùn)行時(shí)庫。

動態(tài)運(yùn)行時(shí)庫

動態(tài)運(yùn)行時(shí)庫主要包括:

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

·對應(yīng)的Import Library文件:MSVCRT.LIB(或 MSVCRTD.LIB for debug build)

靜態(tài)運(yùn)行時(shí)庫

靜態(tài)運(yùn)行時(shí)庫(release版)對應(yīng)的主要文件包括:

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

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

msvcrt.dll提供幾千個(gè)C函數(shù),即使是像printf這么低級的函數(shù)都在msvcrt.dll里。其實(shí)你的程序運(yùn)行時(shí),很大一部分時(shí)間是在這些運(yùn)行庫里運(yùn)行。在你的程序(release版)被編譯時(shí),VC會根據(jù)你的編譯選項(xiàng)(單線程、多線程或DLL)自動將相應(yīng)的運(yùn)行時(shí)庫文件(libc.lib、libcmt.lib或Import Library msvcrt.lib)鏈接進(jìn)來。

2.C運(yùn)行時(shí)庫的作用

C運(yùn)行時(shí)庫除了給我們提供必要的庫函數(shù)調(diào)用(如memcpy、printf、malloc等)之外,它提供的另一個(gè)最重要的功能是為應(yīng)用程序添加啟動函數(shù)。

C運(yùn)行時(shí)庫啟動函數(shù)的主要功能為進(jìn)行程序的初始化,對全局變量進(jìn)行賦初值,加載用戶程序的入口函數(shù)。

不采用寬字符集的控制臺程序的入口點(diǎn)為mainCRTStartup(void)。下面我們以該函數(shù)為例來分析運(yùn)行時(shí)庫究竟為我們添加了怎樣的入口程序。這個(gè)函數(shù)在crt0.c中被定義,下列的代碼經(jīng)過了筆者的整理和簡化:

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();

 /* 獲得環(huán)境信息 */

 _aenvptr = (char *) __crtGetEnvironmentStringsA();

 _setargv(); /* 設(shè)置命令行參數(shù) */

 _setenvp(); /* 設(shè)置環(huán)境參數(shù) */

 _cinit(); /* C數(shù)據(jù)初始化:全局變量初始化,就在這里!*/

 __initenv = _environ;

 mainret = main( __argc, __argv, _environ ); /*調(diào)用main函數(shù)*/

 exit( mainret );

}

從以上代碼可知,運(yùn)行庫在調(diào)用用戶程序的main或WinMain函數(shù)之前,進(jìn)行了一些初始化工作。初始化完成后,接著才調(diào)用了我們編寫的main或WinMain函數(shù)。只有這樣,我們的C語言運(yùn)行時(shí)庫和應(yīng)用程序才能正常地工作起來。

除了crt0.c外,C運(yùn)行時(shí)庫中還包含wcrt0.c、 wincrt0.c、wwincrt0.c三個(gè)文件用來提供初始化函數(shù)。wcrt0.c是crt0.c的寬字符集版,wincrt0.c中包含 windows應(yīng)用程序的入口函數(shù),而wwincrt0.c則是wincrt0.c的寬字符集版。

Visual C++的運(yùn)行時(shí)庫源代碼缺省情況下不被安裝。如果您想查看其源代碼,則需要重裝Visual C++,并在重裝在時(shí)選中安裝運(yùn)行庫源代碼選項(xiàng)。

 下面看一個(gè)未正確使用C運(yùn)行時(shí)庫的控制臺程序:

#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"的時(shí)候發(fā)生了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.

發(fā)生錯誤的原因在于Visual C++對控制臺程序默認(rèn)使用單線程的靜態(tài)鏈接庫,而MFC中的CFile類已暗藏了多線程。我們只需要在Visual C++6.0中依次點(diǎn)選Project->Settings->C/C++菜單和選項(xiàng),在Project Options里修改編譯選項(xiàng)即可。

C運(yùn)行庫和C標(biāo)準(zhǔn)庫的關(guān)系
C標(biāo)準(zhǔn)庫,顧名思義既然是標(biāo)準(zhǔn),就是由標(biāo)準(zhǔn)組織制定的。是由“美國國家標(biāo)準(zhǔn)協(xié)會(American National Standards Institute,ANSI)”為了規(guī)范C語言庫而制定的標(biāo)準(zhǔn)。在最初,各個(gè)大學(xué)各個(gè)公司使用的C語言庫都不盡相同,造成相互移植非常困難,在這個(gè)背景下,制定了這個(gè)標(biāo)準(zhǔn)。

C運(yùn)行庫,是和平臺相關(guān)的,即和操作系統(tǒng)相關(guān)的。它由不同操作系統(tǒng)不同開發(fā)平臺提供不同的C運(yùn)行庫。但是C運(yùn)行庫的部分實(shí)現(xiàn)是基于C標(biāo)準(zhǔn)庫的,即C運(yùn)行庫是各個(gè)操作系統(tǒng)各個(gè)開發(fā)工具根據(jù)自身平臺開發(fā)的庫,某種程度上,可以說C運(yùn)行庫是C標(biāo)準(zhǔn)庫的一個(gè)擴(kuò)展庫,只是加了很多C標(biāo)準(zhǔn)庫所沒有的與平臺相關(guān)的或者不相關(guān)的庫接口函數(shù)。舉例子如:c標(biāo)準(zhǔn)庫的strcpy函數(shù)負(fù)責(zé)字符串的拷貝,但是由于缺少對目地字符串緩沖區(qū)大小的控制,極有可能導(dǎo)致緩沖區(qū)溢出(大量的緩沖區(qū)溢出攻擊都是由于這種漏洞而產(chǎn)生的);相反,Windows提供了能夠?qū)崿F(xiàn)同樣功能的安全的字符串拷貝函數(shù),減少了緩沖區(qū)攻擊的可能,strcpy_s。這些函數(shù)是以c運(yùn)行庫的方式提供的,當(dāng)然,不同的操作系統(tǒng),c運(yùn)行時(shí)庫可能不同,但是對c標(biāo)準(zhǔn)庫的支持是完全一致的,也就是說,在不同的操作系統(tǒng)上,使用同一個(gè)c標(biāo)準(zhǔn)庫的函數(shù)必然產(chǎn)生一致的結(jié)果。

C標(biāo)準(zhǔn)庫中提供的有:

l 標(biāo)準(zhǔn)輸入輸出(stdio.h)。

l 文件操作(stdio.h)。

l 字符操作(ctype.h)。

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

l 數(shù)學(xué)函數(shù)(math.h)。

l 資源管理(stdlib.h)。

l 格式轉(zhuǎn)換(stdlib.h)。

l 時(shí)間/日期(time.h)。

l 斷言(assert.h)。

l 各種類型上的常數(shù)(limits.h & float.h)。

你寫的程序可以沒有math庫,程序照樣運(yùn)行,只是不能處理復(fù)雜的數(shù)學(xué)運(yùn)算,不過如果沒有了C run-time庫,main()就不會被調(diào)用,exit()也不能被響應(yīng)。因?yàn)镃 run-time library包含了C程序運(yùn)行的最基本和最常用的函數(shù)。

如下是C運(yùn)行庫與C標(biāo)準(zhǔn)庫的關(guān)系:

一個(gè)C運(yùn)行庫大致包含了如下功能:

l 啟動與退出:包括入口函數(shù)及入口函數(shù)所依賴的其他函數(shù)等。

l 標(biāo)準(zhǔn)函數(shù):由C語言標(biāo)準(zhǔn)規(guī)定的C語言標(biāo)準(zhǔn)庫所擁有的函數(shù)實(shí)現(xiàn)。(C標(biāo)準(zhǔn)庫)

l I/O:I/O功能的封裝和實(shí)現(xiàn),參見上一節(jié)中I/O初始化部分。

l 堆:堆的封裝和實(shí)現(xiàn),參見上一節(jié)中堆初始化部分。

l 語言實(shí)現(xiàn):語言中一些特殊功能的實(shí)現(xiàn)。

l 調(diào)試:實(shí)現(xiàn)調(diào)試功能的代碼。

操作系統(tǒng)API和C運(yùn)行庫CRT,C標(biāo)準(zhǔn)庫之間區(qū)別
首先,C語言要早于Windows出現(xiàn),而且C語言實(shí)際標(biāo)準(zhǔn)制定的開始時(shí)間也要早于Windows(API概念出現(xiàn)的)系統(tǒng)的開發(fā)時(shí)間。所以Windows系統(tǒng)在開發(fā)的時(shí)候是完全可以使用C語言的。目前最多的說法是用C和匯編實(shí)現(xiàn)的。那么只要用C,就可能用C標(biāo)準(zhǔn)庫。

我們假設(shè)兩種情況,一是Windows API的實(shí)現(xiàn)包含部分C標(biāo)準(zhǔn)庫函數(shù)的功能實(shí)現(xiàn),這就決定了這部分操作系統(tǒng)API的實(shí)現(xiàn)是由調(diào)用標(biāo)準(zhǔn)庫實(shí)現(xiàn)的,那么在發(fā)布時(shí)需要加入所用到的c標(biāo)準(zhǔn)庫DLL一同發(fā)布。

二是微軟的內(nèi)核(包括API)開發(fā)是使用著一個(gè)和平臺嚴(yán)格相關(guān)的C語言的靜態(tài)的鏈接庫,這樣不必提供Dll也能開發(fā)和發(fā)行。而且必然的這個(gè)C庫是在匯編的基礎(chǔ)上實(shí)現(xiàn)的,也就是說這個(gè)庫里面的C函數(shù)都是(至少有很大比例)披著C語法的匯編代碼。

要你是微軟,你選擇哪個(gè)呢?也許是兩者兼而有之,也許是后者。

一般情況下,我們說C運(yùn)行庫暗含的意思是哪種平臺哪個(gè)開發(fā)平臺的C運(yùn)行庫,

CRT的實(shí)現(xiàn)是基于Windows API的,而WindowsAPI的開發(fā)也是基于C語言的,但不是或者不一定基于CRT(或者C標(biāo)準(zhǔn)庫)的。

再深一步,雖然CRT是基于操作系統(tǒng) API實(shí)現(xiàn)的,但并不代表所有的CRT封裝了操作系統(tǒng) API,如一些用戶的權(quán)限控制,操作系統(tǒng)線程創(chuàng)建等都不屬于C運(yùn)行庫,于是對于這些操作我們就不得不直接調(diào)用操作系統(tǒng)API或者其他庫。

總結(jié)一下,C標(biāo)準(zhǔn)庫就是任何平臺都可以使用的基本C語言庫。而CRT除了將C標(biāo)準(zhǔn)庫加入所屬范圍外,還擴(kuò)展了與平臺相關(guān)的接口庫,這些接口實(shí)現(xiàn)根據(jù)不同平臺調(diào)用不同平臺的操作系統(tǒng)API。

如下圖所示,采用C標(biāo)準(zhǔn)庫編寫的程序可以應(yīng)用到windows平臺,也可以應(yīng)用到linux平臺;而用CRT另外與平臺相關(guān)的庫函數(shù)編寫的應(yīng)用程序不能跨平臺運(yùn)行。

分享到:
標(biāo)簽:語言
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定