日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

C运行库和C语言函数库/Microsoft C运行库

發(fā)布時(shí)間:2025/3/15 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C运行库和C语言函数库/Microsoft C运行库 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C運(yùn)行庫(kù)和C語(yǔ)言函數(shù)庫(kù)/Microsoft C運(yùn)行庫(kù)

973人閱讀 評(píng)論(0) 收藏 舉報(bào) c語(yǔ)言librarydll編譯器fortran

1.C運(yùn)行庫(kù)和C語(yǔ)言函數(shù)庫(kù)(象stdio.h,stdlib.h等)是不是同一個(gè)東西? ?
? ?
? 2.在技術(shù)參考書中老說“Microsoft ? C運(yùn)行庫(kù)”,那C運(yùn)行庫(kù)到底是語(yǔ)言本身的庫(kù)還是操作系統(tǒng)的庫(kù)?其它操作系統(tǒng)如unix/linux中有沒有C運(yùn)行庫(kù)? ?
? ?
? 3.為什么既用Win32 ? API,還要用C運(yùn)行庫(kù)?前者能替代后者嗎? ?
? ?
? 4.tchar.h、wchar.h是C運(yùn)行庫(kù)的頭文件還是API的頭文件?TCHAR、WCHAR類型及_TEXT、TEXT等宏分別在哪個(gè)里面定義的?

?

?轉(zhuǎn)貼) ?
? ?
? 1)運(yùn)行時(shí)庫(kù)就是 ? C ? run-time ? library,是 ? C ? 而非 ? C++ ? 語(yǔ)言世界的概念:取這個(gè)名字就是因?yàn)槟愕?? C ? 程序運(yùn)行時(shí)需要這些庫(kù)中的函數(shù). ?
? ?
? 2)C ? 語(yǔ)言是所謂的“小內(nèi)核”語(yǔ)言,就其語(yǔ)言本身來說很小(不多的關(guān)鍵字,程序流程控制,數(shù)據(jù)類型等);所以,C ? 語(yǔ)言內(nèi)核開發(fā)出來之后,Dennis ? Ritchie ? 和 ? Brian ? Kernighan ? 就用 ? C ? 本身重寫了 ? 90% ? 以上的 ? UNIX ? 系統(tǒng)函數(shù),并且把其中最常用的部分獨(dú)立出來,形成頭文件和對(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 ? run-time ? libraries)。 ?
? ?
? 4)C ? run-time ? library里面含有初始化代碼,還有錯(cuò)誤處理代碼(例如divide ? by ? zero處理)。你寫的程序可以沒有math庫(kù),程序照樣運(yùn)行,只是不能處理復(fù)雜的數(shù)學(xué)運(yùn)算,不過如果沒有了C ? run-time庫(kù),main()就不會(huì)被調(diào)用,exit()也不能被響應(yīng)。因?yàn)镃 ? 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針對(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ù)主要是DLL庫(kù)文件msvcrt.dll(or ? MSVCRTD.DLL ? for ? debug ? build),對(duì)應(yīng)的Import ? library文件是MSVCRT.LIB(MSVCRTD.LIB ? for ? debug ? build) ?
? 靜態(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í)間時(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)來。 ?
? ?
? 編譯時(shí)到底哪個(gè)C ? run-time ? library聯(lián)入你的程序取決于編譯選項(xiàng): ?
? /MD, ? /ML, ? /MT, ? /LD ? ? ? (Use ? Run-Time ? Library) ?
? 你可以VC中通過以下方法設(shè)置選擇哪個(gè)C ? run-time ? library聯(lián)入你的程序: ?
? 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. ?
? ?
? 從程序可移植性考慮,如果兩函數(shù)都可完成一種功能,選運(yùn)行時(shí)庫(kù)函數(shù)好,因?yàn)楦鱾€(gè) ? C ? 編譯器的生產(chǎn)商對(duì)標(biāo)準(zhǔn)C ? Run-time ? library提供了統(tǒng)一的支持. ?
? ?
? ? ?
? ? ?
? 對(duì)該文的評(píng)論 ? ? ? ?
? ? han012 ? ( ? 2001-09-03) ? ? ?
? 很高興有許多網(wǎng)友參與討論,并對(duì)本文提出不同的觀點(diǎn), ? 在此表示感謝. ?
? 另外針對(duì)一些網(wǎng)友的評(píng)論,我想有必要進(jìn)行一些補(bǔ)充: ?
? ?
? 1)在Windows環(huán)境中,直到VC++4.0之前(如果我沒有記錯(cuò))只有靜態(tài)的C ? run-time ? library,之后才有了動(dòng)態(tài)的C ? run-time ? library. ? 動(dòng)態(tài)的C ? run-time ? library是以DLL形式給出的. ? 從理論上說,不論是靜態(tài)的還是動(dòng)態(tài)的C ? run-time ? library都是一些編譯好的,可以被運(yùn)行的二進(jìn)制代碼. ? 所以從理論上說,只要符合調(diào)用規(guī)則,"同一操作系統(tǒng)平臺(tái)上的不同編譯系統(tǒng)應(yīng)該可以共享庫(kù)文件"。在這一點(diǎn)上我也贊同PingPingPangPang. ? 正如在本文中沒有一處說 ? "C ? run-time ? library"只能被C/C++使用." ?
? ?
? 2)雖然從理論上說,C ? run-time ? library可以被其他編譯系統(tǒng)共享,但不得不承認(rèn)C ? run-time ? library還是和C語(yǔ)言有更為密切的關(guān)系. ? 這就好比做衣服,C ? run-time ? library是為C語(yǔ)言量身定做的,別人或許可以穿,但大小未必合適. ? 從歷史上看,ANSI ? C是針對(duì)C語(yǔ)言制定了C ? Standard ? Library的標(biāo)準(zhǔn)形式(包括函數(shù)名,調(diào)用規(guī)則,參數(shù)等).即使別的語(yǔ)言可以使用,也必須尊從C ? run-time ? library的調(diào)用規(guī)則. ? 另外下面這段代碼對(duì)C ? run-time ? library函數(shù)fopen,printf的調(diào)用是最自然最直接的,雖然我不熟悉PASCAL,FORTRAN,但我相信如果它們希望調(diào)用C ? run-time ? library函數(shù)fopen,printf,恐怕還要多做一些工作. ?
? ?
? FILE ? *stream; ?
? ... ? ... ?
? if( ? (stream ? ? = ? fopen( ? "data", ? "r" ? )) ? == ? NULL ? ) ?
? ? ? ? ? printf( ? "The ? file ? 'data' ? was ? not ? opened/n" ? ); ?
? else ?
? ? ? ? ? printf( ? "The ? file ? 'data' ? was ? opened/n" ? ); ?
? ... ? ... ?
? ?
? 3)在Windows環(huán)境中,一個(gè)應(yīng)用被加載時(shí)要經(jīng)過以下步驟(截取部分說明,請(qǐng)忽略序號(hào),只參照包含C運(yùn)行時(shí)庫(kù)的說明): ?
? ?
? ... ? ... ?
? 6.主線程為每個(gè)DLL調(diào)用_DLLMainCRTStartu() ? 函數(shù)。 ?
? 當(dāng)鏈接DLL時(shí),鏈接器在生成的DLL文件映象中嵌入了DLL的進(jìn)入/退出函數(shù)的地址。缺省時(shí)為,鏈接器假設(shè)進(jìn)入函數(shù)名為:_DLLMainCRTStartup。該函數(shù)包含在C ? run-time ? library(C運(yùn)行時(shí)庫(kù))文件中。 ?
? 當(dāng)DLL文件被映射到進(jìn)程地址空間時(shí),系統(tǒng)實(shí)際調(diào)用的是該函數(shù)_DLLMainCRTStartup, ? 而不是你的DLLMain函數(shù)。該函數(shù)執(zhí)行: ?
? a.初始化C ? run-time ? library(C運(yùn)行時(shí)庫(kù))。 ?
? // ? Do ? runtime ? startup ? initializers. ?
? _initterm( ? &__xi_a, ? &__xi_z ? ); ?
? ... ? ... ?
? ?
? 7.主線程根據(jù)EXE文件中的子系統(tǒng)值GUI/(CUI),執(zhí)行WinMainCRTStartup/(MainCRTStartup) ?
? a.得到一個(gè)新進(jìn)程的全部命令行的指針。 ?
? b.得到一個(gè)新進(jìn)程的環(huán)境變量指針。 ?
? c.通過STDLIB.H來初始化能被應(yīng)用訪問的C ? run-time ? library(C運(yùn)行時(shí)庫(kù))全局變量。例如 ?
? _osver, ? _winmajor, ? _winminor, ? _winver, ? _argc, ? _argv, ? _environ. ?
? // ? Do ? runtime ? startup ? initializers. ?
? _initterm( ? __xi_a, ? __xi_z ? ); ?
? ... ? ... ?
? ?
? 所以說C ? run-time ? library(C運(yùn)行時(shí)庫(kù))中確實(shí)包含了針對(duì)C ? run-time ? library自己的初始化代碼,例如初始化C ? run-time ? library(C運(yùn)行時(shí)庫(kù))全局變量_argc, ? _argv, ? _environ. ? 我不知道在PASCAL,FORTRAN程序中是否可以調(diào)用這些全局變量.

總結(jié)

以上是生活随笔為你收集整理的C运行库和C语言函数库/Microsoft C运行库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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