windows 下的C標準庫, C執行庫(CRT ,run-time), windows API 解釋. 以及linux C擴充套件
C執行庫和C標準庫的關係
C標準庫,顧名思義既然是標準,就是由標準組織制定的。是由“美國國家標準協會(American National Standards Institute,ANSI)”為了規範C語言庫而制定的標準。在最初,各個大學各個公司使用的C語言庫都不盡相同,造成相互移植非常困難,在這個背景下,制定了這個標準。
C執行庫,是和平臺相關的,即和作業系統相關的。它由不同作業系統不同開發平臺提供不同的C執行庫。但是C執行庫的部分實現是基於C標準庫的,即C執行庫是各個作業系統各個開發工具根據自身平臺開發的庫,某種程度上,可以說C執行庫是C標準庫的一個擴充套件庫,只是加了很多C標準庫所沒有的與平臺相關的或者不相關的庫介面函式。舉例子如:c標準庫的strcpy函式負責字串的拷貝,但是由於缺少對目地字串緩衝區大小的控制,極有可能導致緩衝區溢位(大量的緩衝區溢位攻擊都是由於這種漏洞而產生的);相反,Windows提供了能夠實現同樣功能的安全的字串拷貝函式,減少了緩衝區攻擊的可能,strcpy_s。這些函式是以c執行庫的方式提供的,當然,不同的作業系統,c執行時庫可能不同,但是對c標準庫的支援是完全一致的,也就是說,在不同的作業系統上,使用同一個c標準庫的函式必然產生一致的結果。
C標準庫函式也稱為ANSI C庫函式, 在linux 下是用libc表示。 glibc是linux下的GUN C庫函式庫。(也就是libc的一個擴充套件)。glibc是由linux下面C標準庫的實現,即GNU Clibrary. glibc本身是GUN旗下的c標準庫, 後來逐漸成為linux的標準庫,而linux下原來的C標準庫linux libc逐漸不再被維護。linux下的標準庫C不僅有這個如uclibc ,klibc .
但是glibc是被用得最多的
---------------linux 的擴充套件 glibc 與 glib與libc--------------------
錯誤觀點:glib前面有一個g認為是gnu的東西,同時認為glibc 是glib的一個子集。
其實glib通用性更強。 glib和glibc沒有太大關係,可能唯一的共同點是其都是c程式設計需要呼叫的庫而已。
glib 是 Gtk+ 庫和 Gnome 的基礎。glib 可以在多個平臺下使用,比如 Linux、Unix、Windows 等。glib 為許多標準的、常用的 C 語言結構提供了相應的替代物。
glib是GTK+的基礎庫,它由基礎型別、對核心應用的支援、實用功能、資料型別和物件系統五個部分組成,可以在[http://www.gtk.org
gtk網站]下載其原始碼。是一個綜合用途的實用的輕量級的C程式庫,它提供C語言的常用的資料結構的定義、相關的處理函式,有趣而實用的巨集,可移植的封裝和一些執行時機能,如事件迴圈、執行緒、動態呼叫、物件系統等的API。GTK+是可移植的,當然glib也是可移植的,你可以在linux下,也可以在windows下使用它。使用gLib2.0(glib的2.0版本)編寫的應用程式,在編譯時應該在編譯命令中加入pkg-config
--cflags --libs glib-2.0
,如:
gcc
pkg-config --cflags --libs glib-2.0
hello.c -o hello
使用glib最有名的就是GNOME了。
【其他說法】
libc 實際上是一個泛指。凡是符合實現了 C 標準規定的內容,都是一種 libc 。
glibc 是 GNU 組織對 libc 的一種實現。它是 unix/linux 的根基之一。
微軟也有自己的 libc 實現,叫 msvcrt 。
嵌入式行業裡還常用 uClibc ,是一個迷你版的 libc 。
【總結】
libc, glibc在一個層次,都是C的標準實現庫,是作業系統級別的基石之一。
glib是用C寫的一些utilities,即C的工具庫,和libc/glibc沒有關係。
---------------------------
C標準庫中提供的有:
- <ctype.h>:包含用來測試某個特徵字元的函式的函式原型,以及用來轉換大小寫字母的函式原型;
- <errno.h>:定義用來報告錯誤條件的巨集;
- <float.h>:包含系統的浮點數大小限制;
- <math.h>:包含數學庫函式的函式原型;
- <stddef.h>:包含執行某些計算 C 所用的常見的函式定義;
- <stdio.h>:包含標準輸入輸出庫函式的函式原型,以及他們所用的資訊;
- <stdlib.h>:包含數字轉換到文字,以及文字轉換到數字的函式原型,還有記憶體分配、隨機數字以及其他實用函式的函式原型;
- <string.h>:包含字串處理函式的函式原型;
- <time.h>:包含時間和日期操作的函式原型和型別;
- <stdarg.h>:包含函式原型和巨集,用於處理未知數值和型別的函式的引數列表;
- <signal.h>:包含函式原型和巨集,用於處理程式執行期間可能出現的各種條件;
- <setjmp.h>:包含可以繞過一般函式呼叫並返回序列的函式的原型,即非區域性跳轉;
- <locale.h>:包含函式原型和其他資訊,使程式可以針對所執行的地區進行修改。
- 地區的表示方法可以使計算機系統處理不同的資料表達約定,如全世界的日期、時間、美元數和大數字;
- <assert.h>:包含巨集和資訊,用於進行診斷,幫助程式除錯。
上述庫函式在其各種支援 C 語言的 IDE 中都是有的。
接下來繼續說windows:
你寫的程式可以沒有math庫,程式照樣執行,只是不能處理複雜的數學運算,不過如果沒有了C run-time庫,main()就不會被呼叫,exit()也不能被響應。因為C
run-time library包含了C程式執行的最基本和最常用的函式。
如下是C執行庫與C標準庫的關係:
一個C執行庫大致包含了如下功能:
l 啟動與退出:包括入口函式及入口函式所依賴的其他函式等。
l 標準函式:由C語言標準規定的C語言標準庫所擁有的函式實現。(C標準庫)
l I/O:I/O功能的封裝和實現,參見上一節中I/O初始化部分。
l 堆:堆的封裝和實現,參見上一節中堆初始化部分。
l 語言實現:語言中一些特殊功能的實現。
l 除錯:實現除錯功能的程式碼。
CRT的實現是基於Windows API的, 而windows API的開發是基於C語言(標準庫)的,當然還有特有功能的彙編函式。 CRT在windows的表現方式是 msvcrt。
當然並不代表CRT封裝了所有的作業系統API ,如一些使用者許可權控制,作業系統執行緒建立都不屬於CRT(msvcrt) ,這些操作的實現就不得不直接
呼叫作業系統API。
相關文章
- C 擴充套件庫 – mysql API套件MySqlAPI
- C/C++執行時庫 解釋C++
- C 標準庫 -
- C++標準庫、C++標準模版庫介紹C++
- c/c++ 標準庫 vectorC++
- Windows 7 下用C++為node.js寫擴充套件模組WindowsC++Node.js套件
- C++標準庫C++
- linux下php實現C/C++擴充套件程式設計LinuxPHPC++套件程式設計
- Windows 下 c++ 呼叫 Rust 庫的例子WindowsC++Rust
- 什麼是 C 和 C ++ 標準庫?
- c/c++ 標準庫 map set 插入C++
- c/c++ 標準庫 迭代器(iterator)C++
- C++ 對C的擴充套件有哪些C++套件
- C標準庫學習
- - C語言標準庫C語言
- C++標準庫:chronoC++
- C++標準庫:randomC++random
- C# 擴充套件方法 借籤於 Objective-C 擴充套件類.C#套件Object
- Linux 核心使用的 GNU C 擴充套件(轉)Linux套件
- C 標準庫 – ctype.h
- C++標準模板庫------容器C++
- C++標準庫::拾遺C++
- C++對C語言的擴充套件(1)--引用C++C語言套件
- C#.NET擴充套件方法C#套件
- C#呼叫Windows API詳解(上)C#WindowsAPI
- C語言標準函式庫C語言函式
- C-如何快速生成Python的C擴充套件.mdPython套件
- win10怎麼給c盤增加空間_windows10擴充套件c盤空間的方法Win10Windows套件
- C語言的本質(22)——C標準庫之字串操作C語言字串
- PostgreSql擴充套件Sql-動態載入共享庫(C函式)SQL套件函式
- C語言的本質(24)——C標準庫之輸入與輸出(下)C語言
- C到C++的擴充C++
- Linux下安裝PHP的lua擴充套件庫LinuxPHP套件
- 知識庫(2)-使用Windows OpenGL擴充套件機制來訪問OpenGL擴充套件 (轉)Windows套件
- C#中的擴充套件類的理解C#套件
- c#標準註釋C#
- C++ 及標準庫中的那些大坑C++
- c盤擴充套件卷選項是灰的怎麼辦 c盤不能擴充套件卷的辦法套件