C运行库和C语言函数库/Microsoft C运行库
生活随笔
收集整理的這篇文章主要介紹了
C运行库和C语言函数库/Microsoft C运行库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C運行庫和C語言函數庫/Microsoft C運行庫
2009-03-04 10:27 973人閱讀 評論(0) 收藏 舉報 c語言librarydll編譯器fortran1.C運行庫和C語言函數庫(象stdio.h,stdlib.h等)是不是同一個東西? ?
? ?
? 2.在技術參考書中老說“Microsoft ? C運行庫”,那C運行庫到底是語言本身的庫還是操作系統的庫?其它操作系統如unix/linux中有沒有C運行庫? ?
? ?
? 3.為什么既用Win32 ? API,還要用C運行庫?前者能替代后者嗎? ?
? ?
? 4.tchar.h、wchar.h是C運行庫的頭文件還是API的頭文件?TCHAR、WCHAR類型及_TEXT、TEXT等宏分別在哪個里面定義的?
?
?轉貼) ?? ?
? 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 ? run-time ? 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提供了統一的支持. ?
? ?
? ? ?
? ? ?
? 對該文的評論 ? ? ? ?
? ? han012 ? ( ? 2001-09-03) ? ? ?
? 很高興有許多網友參與討論,并對本文提出不同的觀點, ? 在此表示感謝. ?
? 另外針對一些網友的評論,我想有必要進行一些補充: ?
? ?
? 1)在Windows環境中,直到VC++4.0之前(如果我沒有記錯)只有靜態的C ? run-time ? library,之后才有了動態的C ? run-time ? library. ? 動態的C ? run-time ? library是以DLL形式給出的. ? 從理論上說,不論是靜態的還是動態的C ? run-time ? library都是一些編譯好的,可以被運行的二進制代碼. ? 所以從理論上說,只要符合調用規則,"同一操作系統平臺上的不同編譯系統應該可以共享庫文件"。在這一點上我也贊同PingPingPangPang. ? 正如在本文中沒有一處說 ? "C ? run-time ? library"只能被C/C++使用." ?
? ?
? 2)雖然從理論上說,C ? run-time ? library可以被其他編譯系統共享,但不得不承認C ? run-time ? library還是和C語言有更為密切的關系. ? 這就好比做衣服,C ? run-time ? library是為C語言量身定做的,別人或許可以穿,但大小未必合適. ? 從歷史上看,ANSI ? C是針對C語言制定了C ? Standard ? Library的標準形式(包括函數名,調用規則,參數等).即使別的語言可以使用,也必須尊從C ? run-time ? library的調用規則. ? 另外下面這段代碼對C ? run-time ? library函數fopen,printf的調用是最自然最直接的,雖然我不熟悉PASCAL,FORTRAN,但我相信如果它們希望調用C ? run-time ? library函數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環境中,一個應用被加載時要經過以下步驟(截取部分說明,請忽略序號,只參照包含C運行時庫的說明): ?
? ?
? ... ? ... ?
? 6.主線程為每個DLL調用_DLLMainCRTStartu() ? 函數。 ?
? 當鏈接DLL時,鏈接器在生成的DLL文件映象中嵌入了DLL的進入/退出函數的地址。缺省時為,鏈接器假設進入函數名為:_DLLMainCRTStartup。該函數包含在C ? run-time ? library(C運行時庫)文件中。 ?
? 當DLL文件被映射到進程地址空間時,系統實際調用的是該函數_DLLMainCRTStartup, ? 而不是你的DLLMain函數。該函數執行: ?
? a.初始化C ? run-time ? library(C運行時庫)。 ?
? // ? Do ? runtime ? startup ? initializers. ?
? _initterm( ? &__xi_a, ? &__xi_z ? ); ?
? ... ? ... ?
? ?
? 7.主線程根據EXE文件中的子系統值GUI/(CUI),執行WinMainCRTStartup/(MainCRTStartup) ?
? a.得到一個新進程的全部命令行的指針。 ?
? b.得到一個新進程的環境變量指針。 ?
? c.通過STDLIB.H來初始化能被應用訪問的C ? run-time ? library(C運行時庫)全局變量。例如 ?
? _osver, ? _winmajor, ? _winminor, ? _winver, ? _argc, ? _argv, ? _environ. ?
? // ? Do ? runtime ? startup ? initializers. ?
? _initterm( ? __xi_a, ? __xi_z ? ); ?
? ... ? ... ?
? ?
? 所以說C ? run-time ? library(C運行時庫)中確實包含了針對C ? run-time ? library自己的初始化代碼,例如初始化C ? run-time ? library(C運行時庫)全局變量_argc, ? _argv, ? _environ. ? 我不知道在PASCAL,FORTRAN程序中是否可以調用這些全局變量.
總結
以上是生活随笔為你收集整理的C运行库和C语言函数库/Microsoft C运行库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玉米转座子插入型突变体”五折优惠
- 下一篇: 数学教材里的神秘数表在国外红出圈,网友: