聊聊我理解的ANSI C、ISO C、GNU C、POSIX C

ulysses發表於2019-05-10

幾句話瞭解C標準之間的關係

C語言標準

  1. 早期的計算機組合語言是與機器平臺緊密耦合的,為了遮蔽這種耦合,增加程式碼的可移植性,C語言隨機出現。
  2. 二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標準局為C語言制定了一套完整的國際標準語法,稱為ANSI C,作為C語言最初的標準。
  3. 與ANSI C標準同時出現的就是ISO組織,將ANSI C加入了ISO的大家庭,定義了ISO C。除了在格式和排版等方面存在一些差別外,其他都與ANSI C相同。
  4. 所以一句話ANSI C與ISO C 對於我們開發者來說完全相同。
  5. 目前出現的C標準如下:

    • C89
    • C99
    • C11
  6. 對於程式設計來說,不同的機器平臺的編譯器可能不同,但是他必須按照ISO C的標準來實現,即他必須支援對於C標準的語法規則的編譯。當然隨著C標準的演進,編譯器也是需要隨之演進的,比如當前的C11標準,不是所有的編譯器均支援。
  7. 交叉編譯,就是在一個平臺上通過交叉編譯器,編譯另個平臺上執行的程式。編譯器起到重要作用哦~

C標準庫

  • C標準庫是嚴格按照C標準規範實現的一個C庫,在Linux下有個叫libc的庫就是標準庫了。有些Linux下可能已經和glibc打包到一起了。
  • 起初的C標準庫存在15個標頭檔案(後續介紹),我認為這15個標頭檔案是我們作為C開發者必須知道的。每個語言的誕生都會有一些語言對應的庫提供給開發者,這是一個語言能夠發展起來的基礎。(個人理解哈~)

POSIX C

  1. 說起POSIX C有人會鄙視我,說根本就沒有POSIX C,對是沒有POSIX C標準,但是有POSIX C庫。
  2. 首先要理解什麼事POSIX,全稱:可移植作業系統介面。故名思議,由於當時Unix誕生之後,由於各個廠商都實現自己的Unix(都敢使用Unix,由於版權的問題),介面的不統一,導致在各個廠商下基於不同的作業系統開發變得很亂,為了解決這一問題,便有了POSIX標準。
  3. 一句話:POSIX標準的誕生是為了統一個作業系統的介面,方便開發者開發程式,寫出可移植的程式碼程式。基於POSIX標準的庫函式都是可以在持之此標準的作業系統平臺上移植的。
  4. 我們說的posix c庫就是基於POSIX標準定義的一套標頭檔案實現的lib庫。
  5. 所以說我們man手冊中經常會看到POSIX Program資訊,表示是遵循POSIX標準而實現的。

展示一下ANSI C和POSIX C庫的標頭檔案哪些。如下展示的C標準庫標頭檔案是被擴充套件之後的標準,而不是起初的標準庫了。增加了一些功能。
http://www.cnitblog.com/guopi…

GNU C

  1. GNU 是一個自由軟體基金會,GNU`s Not Unix.
  2. GNU 是為了實現自由開源目的一個基金會,它提供了很多基於POSIX標準的軟體和庫,比如glibc、gcc、emacs等等。
  3. 聊到這裡就要聊聊Linux了,Linux誕生相信大家都聽說過了,此處不再提。由於Linux開發者擁護GNU理念,將Linux也就遵循了GNU標準,並且Linux的開發也使用了GNU提供的大量的庫函式。
  4. 所以每個Linux版本都存在glibc的庫。
  5. Linux為了相容性考慮在設計之初就按照POSIX標準,支援了POSIX標準。
  6. GNU C叫做glibc是Linux上的一個基礎庫,glibc C實現了POSIX C標準的庫函式功能,有些POSIX標準是單獨的庫函式存在的
  7. 小插曲:由於GNU組織沒有開發出很完善的作業系統核心,使用了Linux核心,所以將Linux納入進來,又由於GNU組織存在很多開源的很好的工具元件促使Linux快速成長,所以說GNU和Linux是相互成全。(個人感覺僅供參考~)

C語言學習個人總結

  1. 想要使用C語言開發軟體系統,必須瞭解C標準包括語法規則,其次瞭解C標準庫清楚哪些基礎庫可以使用,使用時再查也是可以的。
  2. 對於C標準庫應該各個作業系統平臺都支援,放心使用即可。
  3. 在類Unix、Linux作業系統上程式設計,當然要學習POSIX標準,瞭解POSIX提供了哪些程式設計介面,方便快速開發。
  4. 在Windows上當然也有一套程式設計介面,不瞭解不瞎嗶嗶了。但是:不是說windows完全不支援POSIX標準。Windows NT-based 系統不能直接支援新版POSIX介面,僅支援第一版POSIX v1:ISO/IEC9945-1:1990[1]版標準。由於僅支援第一版POSIX的Windows NT-based系統不能建立符合POSIX介面標準的執行緒和窗體、套接字,所以微軟公司提供POSIX相容層Microsoft POSIX subsystem軟體包(Windows Services for UNIX)以支援新版POSIX介面,Windows 系統還可以執行其他POSIX相容層例如Cygwin.
  5. C標準不斷的演進有些新增語法也是值得學習的,畢竟新增的語法和標頭檔案更加方便我們開發程式。
  6. GNU C中存在一些對於C標準的優化,如果是在Linux上開發程式,那我們應該大膽的使用它,方便我們程式的開發。例如關於__attribute__的機制就是GNU C的一大特色。所以關於GNU C我們也是要好好的學習一下的。

相關文章