日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

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

發(fā)布時(shí)間:2025/4/5 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c运行库、c标准库、windows API的区别和联系 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

c運(yùn)行庫(kù)、c標(biāo)準(zhǔn)庫(kù)、windows API的區(qū)別和聯(lián)系

C運(yùn)行時(shí)庫(kù)函數(shù)
C運(yùn)行時(shí)庫(kù)函數(shù)是指C語(yǔ)言本身支持的一些基本函數(shù),通常是匯編直接實(shí)現(xiàn)的。
??
API函數(shù)
API函數(shù)是操作系統(tǒng)為方便用戶設(shè)計(jì)應(yīng)用程序而提供的實(shí)現(xiàn)特定功能的函數(shù),API函數(shù)也是C語(yǔ)言的函數(shù)實(shí)現(xiàn)的。

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

·1、運(yùn)行時(shí)庫(kù)就是 C run-time library,是C而非C++語(yǔ)言世界的概念。
?????取這個(gè)名字就是因?yàn)槟愕腃程序運(yùn)行時(shí)需要這些庫(kù)中的函數(shù)。

·2、C語(yǔ)言是所謂的“小內(nèi)核”語(yǔ)言,就其語(yǔ)言本身來(lái)說(shuō)很小(不多的關(guān)鍵字,程序流程控制,數(shù)據(jù)類型等);
?????所以,C語(yǔ)言內(nèi)核開(kāi)發(fā)出來(lái)之后,Dennis Ritchie和Brian Kernighan就用C本身重寫(xiě)了90%以上的UNIX系統(tǒng)
?????函數(shù),并且把其中最常用的部分獨(dú)立出來(lái),形成頭文件和對(duì)應(yīng)的LIBRARY,C run-time Library就是這樣
?????形成的。?

·3、隨后,隨著C語(yǔ)言的流行,各個(gè)C編譯器的生產(chǎn)商/個(gè)體/團(tuán)體都遵循老的傳統(tǒng),在不同平臺(tái)上都有相對(duì)應(yīng)
?????的Standard Library,但大部分實(shí)現(xiàn)都是與各個(gè)平臺(tái)有關(guān)的。由于各個(gè)C編譯器對(duì)C的支持和理解有很多
?????分歧和微妙的差別,所以就有了ANSI C;ANSI C(主觀意圖上)詳細(xì)的規(guī)定了C語(yǔ)言各個(gè)要素的具體含義
?????和編譯器實(shí)現(xiàn)要求,引進(jìn)了新的函數(shù)聲明方式,同時(shí)訂立了Standard Library的標(biāo)準(zhǔn)形式。所以C運(yùn)行時(shí)
?????庫(kù)由編譯器生產(chǎn)商提供。至于由其他廠商/個(gè)人/團(tuán)體提供的頭文件和庫(kù)函數(shù),應(yīng)當(dāng)稱為第三方C運(yùn)行庫(kù)
????(Third party C runtime libraries)。

·4、C run-time library里面含有初始化代碼,還有錯(cuò)誤處理代碼(例如divide by zero處理)。你寫(xiě)的程序
?????可以沒(méi)有math庫(kù),程序照樣運(yùn)行,只是不能處理復(fù)雜的數(shù)學(xué)運(yùn)算,不過(guò)如果沒(méi)有了C run-time庫(kù),main()
?????就不會(huì)被調(diào)用,exit()也不能被響應(yīng)。因?yàn)?C run-time Library 包含了C程序運(yùn)行的最基本和最常用的
?????函數(shù)。

·5、到了C++世界里,有另外一個(gè)概念:Standard C ++ Library,它包括了上面所說(shuō)的C run-time Library
?????和STL。包含C run-time?Library的原因很明顯,C++是C的超集,沒(méi)有理由再重新來(lái)一個(gè)C++ run-time
?????Library。VC針對(duì)C++加入的Standard C ++ Library主要包括:LIBCP.LIB、LIBCPMT.LIB和MSVCPRT.LIB。

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

動(dòng)態(tài)運(yùn)行時(shí)庫(kù)
動(dòng)態(tài)運(yùn)行時(shí)庫(kù)主要包括:
·DLL庫(kù)文件:msvcrt.dll(或 MSVCRTD.DLL for debug build)
·對(duì)應(yīng)的Import Library文件:MSVCRT.LIB(或 MSVCRTD.LIB for debug build)

靜態(tài)運(yùn)行時(shí)庫(kù)
靜態(tài)運(yùn)行時(shí)庫(kù)(release版)對(duì)應(yīng)的主要文件包括: ?
·LIBC.LIB(Single thread static library, retail version) ?
·LIBCMT.LIB(Multithread static library, retail version) ?
???
????msvcrt.dll提供幾千個(gè)C函數(shù),即使是像printf這么低級(jí)的函數(shù)都在msvcrt.dll里。其實(shí)你的程序運(yùn)行時(shí),很大一部分時(shí)間是在這些運(yùn)行庫(kù)里運(yùn)行。在你的程序(release版)被編譯時(shí),VC會(huì)根據(jù)你的編譯選項(xiàng)(單線程、多線程或DLL)自動(dòng)將相應(yīng)的運(yùn)行時(shí)庫(kù)文件(libc.lib、libcmt.lib或Import Library msvcrt.lib)鏈接進(jìn)來(lái)。

?

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

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

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

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

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)行庫(kù)在調(diào)用用戶程序的main或WinMain函數(shù)之前,進(jìn)行了一些初始化工作。初始化完成后,接著才調(diào)用了我們編寫(xiě)的main或WinMain函數(shù)。只有這樣,我們的C語(yǔ)言運(yùn)行時(shí)庫(kù)和應(yīng)用程序才能正常地工作起來(lái)。

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

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

?

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

?

#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 << "\n";
  #endif
 }
 END_CATCH

?

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

?

  我們?cè)?#34;rebuild all"的時(shí)候發(fā)生了link錯(cuò)誤:

?

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

?

?

C運(yùn)行庫(kù)和C標(biāo)準(zhǔn)庫(kù)的關(guān)系

?

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

?

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

?

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

?

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)。

?

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

?

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

?

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

?

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

?

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

?

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

?

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

?

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

?

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

?

操作系統(tǒng)API和C運(yùn)行庫(kù)CRT,C標(biāo)準(zhǔn)庫(kù)之間區(qū)別

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

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

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

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

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

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

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

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

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

?

而不同平臺(tái)的操作系統(tǒng)API實(shí)現(xiàn),是用C標(biāo)準(zhǔn)庫(kù)呢,還是匯編呢,這個(gè)可有,可沒(méi)有。畢竟那么多windows API只要發(fā)現(xiàn)一個(gè)調(diào)用C標(biāo)準(zhǔn)庫(kù)的了,就有了。概念理解了即可,至于微軟實(shí)現(xiàn)的時(shí)候基于何種考慮不使用C標(biāo)準(zhǔn)庫(kù),或者使用C標(biāo)準(zhǔn)庫(kù)都有自己的考慮。那就是操作系統(tǒng)內(nèi)部的研究范圍了,等我知道了之后再確定這點(diǎn)。哈哈。。。。。。

?

轉(zhuǎn)載:https://blog.csdn.net/HQ354974212/article/details/78199071

總結(jié)

以上是生活随笔為你收集整理的c运行库、c标准库、windows API的区别和联系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本韩国欧美一区二区三区 | 亚洲人无码成www久久 | 污网站在线播放 | 波多野av在线 | 欧美亚洲一 | 中文字幕资源站 | 九色.com| av天堂一区 | 香蕉网伊 | 亚色影库 | 午夜激情电影在线观看 | 少妇裸体性生交 | 九一精品在线 | 亚洲免费视频网 | 在线免费看av片 | 手机在线视频一区 | 欧美夜夜爽 | xx69欧美| 国产一精品一aⅴ一免费 | 久久精品1 | 久久欧| 西西4444www大胆无视频 | 国产乱码在线 | 在线一区二区视频 | 99热99re6国产在线播放 | 亚洲欧美视频二区 | 在线一区不卡 | 四虎在线视频 | 欧美视频一区二区在线观看 | 日韩在线一卡二卡 | 五月激情婷婷在线 | 91在线视频导航 | 人妻精品久久久久中文字幕69 | 999视频在线播放 | 不卡在线视频 | 蜜桃av噜噜一区二区三区小说 | 狠狠干在线观看 | 99国产超薄肉色丝袜交足 | 国产视频一区二区在线 | www.日韩在线 | 182在线视频 | 在线天堂av| 亚洲一级在线 | 国产视频一区二区在线观看 | 依依激情网 | 又粗又猛又爽又黄少妇视频网站 | 在线观看www. | 国产xxxx性hd极品 | 欧洲视频一区二区三区 | 青青青青草 | 成人欧美一区二区三区在线播放 | 伊人网欧美 | 日韩免费| 国产二区av | 欧美成人高潮一二区在线看 | 少妇精品无码一区二区 | 精品久久久久久久久久久久久久久久 | 69激情网| 国产福利片在线观看 | 多男调教一女折磨高潮高h 国内毛片毛片毛片毛片毛片 | 嫩草在线观看视频 | 激情国产一区 | 欧美久久免费 | 人妻人人澡人人添人人爽 | 成人免费毛片东京热 | 午夜精品久久久久久毛片 | 日本中文字幕网 | 亚洲午夜无码久久 | av老司机在线观看 | 精品国产乱码久久久久夜深人妻 | 国产视频一区二区三区在线观看 | 天天插夜夜操 | 总裁边开会边做小娇妻h | 午夜黄色在线 | 男女猛烈无遮挡 | 五月天综合社区 | 久久一二三四区 | www.久草.com | 香蕉久久夜色精品国产使用方法 | 成人羞羞国产免费 | 国产亚洲精品精品国产亚洲综合 | 爱情岛论坛av | 国产精品va无码一区二区 | 放几个免费的毛片出来看 | 久久久久久久久久久久国产精品 | 无码成人精品区一级毛片 | 少妇做爰免费视频播放 | 中文字幕在线观看你懂的 | 国产精品美女毛片真酒店 | 亚洲av无码不卡一区二区三区 | 无码精品一区二区三区在线 | 邵氏电影《金莲外传2》免费观看 | 亚洲国产综合在线 | 国产女人被狂躁到高潮小说 | 午夜黄色在线 | 91亚洲欧美激情 | 探花av在线 | 蜜桃在线一区二区 | 黄色成人av网站 |