C 語言的標準
什么是標準?標準是對重復性事物和概念所做的統一規定,他以科學技術和實踐經驗的結合成果為基礎,經有關方面協商一致,由主管機構批準,以特定形式發布作為共同遵守的準則和依據。
在這個標準概念大行其道的今天,如果大家在生活中稍微注意一下,其實可以很容易發現,我們生活在一個標準化的世界里,每個產品的外包裝或者標簽上都會注明相應的執行標準。標準貫穿著我們的衣食住行。??偠灾?,標準無處不在。
當然標準具有行業性與地域性。每個國家基本都有自己的標準,這些標準有些是自己獨立創造的,但更多的,為了與國際上大部分標準兼容,基本上會使用國際上一些通用的標準,只是改一下名字就可以了。
作為軟件行業中的老大哥級人物。C 語言也有自己的標準,而且是國際標準。
如果大家遵循同一個標準,那么就會避免分歧的產生,避免出現很多不必要的麻煩和困擾。按照這統一標準就不會出現不兼容的問題。
我們先來看下 C 語言標準的發展歷史:
1. C 語言標準歷史
序號 | 別稱 | 全稱 |
---|---|---|
1 | C18 | ISO/IEC 9899:2018 |
2 | C11 | ISO/IEC 9899:2011 |
3 | C99 | ISO/IEC 9899:1999 |
4 | C95 | ISO/IEC 9899:1990/AMD 1:1995 |
5 | C90 | ISO/IEC 9899:1990 |
6 | C89 | ANSI X3.159-1989 |
最新執行的 C 語言的國際標準是序號為 1 的 C18 標準(ISO/IEC 9899:2018 (C18)),這個標準是 2018 年通過的 C 語言國際標準。那么 C 語言的標準中都規定了哪些內容呢?下面我們一起來看下:
2. C 語言標準內容
這里我將國際標準化組織最新的 C 語言的標準的一部分內容放在這里,因為所有的標準都不是免費提供的,有興趣的同學可以購買看一下全文。
那么這些標準里面都有哪些內容呢?
因為我并沒有購買 C 語言的最新標準,所以我找了一點來自于 C 語言標準中描述。下面這段話就通過文字的描述,定義了有關 main 函數的細節:
The function called at program startup is named main. The implementation
declares no prototype for this function. It shall be defined with a return
type of int and with no parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names
may be used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent;10) or in some other implementation-defined manner.
這里寫明了 main 函數是做什么的,應該怎么寫,包含了什么參數以及返回值等。正確的 main 函數的正確的書寫方法應該是 int main(void) { /* ... */ }
或者 int main(int argc, char *argv[]) { /* ... */ }
。而不是我們國內隨處可以看到的 void main(void) {/* ... */}
或者 void main(int argc, char *argv[]) { /* ... */ }
。這種寫法在有的編譯器下是會產生錯誤的,導致編譯無法進行。而且這個返回值是可以輸出的,可以作為程序是否正確執行的判斷,比如你可以用返回值 0 放在程序執行完整后返回,返回 0 就可以判斷程序完整執行了。如果返回了其他數值,那么程序就出現了異常。
由于購買標準太貴了,需要 198 瑞士法郎,折合人民幣 1422.08 元,所以這里只能給大家看一點從其他網站上找到的信息。不過超過 500 頁的標準全文對于大家學習這門語言也沒有太大的益處。只要記住在最新的是最好的就可了。
3. 小結
標準的重要性不用過多贅述,如同大家使用的眾多版本的安卓手機,和只有一個版本的蘋果手機系統一樣。過多的標準會讓開發者無所適從,各自對于自己系統的魔改優化,只能讓普通用戶陷入深淵。因此為了避免各自為政的情況出現, C 語言很早就有了自己的標準,這樣就可以完成一統天下的局面。雖然各個編譯器有自己的局部特點,但是總體而言,只要是按照 C 語言標準編寫的程序可以在任何一個編譯器上通過編譯。