天天看點

c 标準和c++标準

C語言的發展階段

C語言之是以命名為C,是因為 C語言源自Ken Thompson發明的B語言,而 B語言則源自BCPL語言。

  1. 1967年,劍橋大學的Martin Richards對CPL語言進行了簡化,于是産生了BCPL(Basic Combined Programming Language)語言。
  2. 20世紀60年代,美國AT&T公司貝爾實驗室(AT&T Bell Laboratory)的研究員Ken Thompson閑來無事,手癢難耐,想玩一個他自己編的,模拟在太陽系航行的電子遊戲——Space Travel。他背着老闆,找到了台空閑的機器——PDP-7。但這台機器沒有作業系統,而遊戲必須使用作業系統的一些功能,于是他着手為PDP-7開發作業系統。後來,這個作業系統被命名為——UNIX。
  3. 1970年,美國貝爾實驗室的 Ken Thompson,以BCPL語言為基礎,設計出很簡單且很接近硬體的B語言(取BCPL的首字母)。并且他用B語言寫了第一個UNIX作業系統。
  4. 1971年,同樣酷愛Space Travel的Dennis M.Ritchie為了能早點兒玩上遊戲,加入了Thompson的開發項目,合作開發UNIX。他的主要工作是改造B語言,使其更成熟。
  5. 1972年,美國貝爾實驗室的 D.M.Ritchie 在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C語言。
  6. 1973年初,C語言的主體完成。Thompson和Ritchie迫不及待地開始用它完全重寫了UNIX。此時,程式設計的樂趣使他們已經完全忘記了那個"Space Travel",一門心思地投入到了UNIX和C語言的開發中。随着UNIX的發展,C語言自身也在不斷地完善。直到今天,各種版本的UNIX核心和周邊工具仍然使用C語言作為最主要的開發語言,其中還有不少繼承Thompson和Ritchie之手的代碼。
  7. 在開發中,他們還考慮把UNIX移植到其他類型的計算機上使用。C語言強大的移植性(Portability)在此顯現。機器語言和彙編語言都不具有移植性,為x86開發的程式,不可能在Alpha,SPARC和ARM等機器上運作。而C語言程式則可以使用在任意架構的處理器上,隻要那種架構的處理器具有對應的C語言編譯器和庫,然後将C源代碼編譯、連接配接成目标二進制檔案之後即可運作。
  8. 1977年,Dennis M.Ritchie發表了不依賴于具體機器系統的C語言編譯文本《可移植的C語言編譯程式》。

C語言繼續發展,在1982年,很多有識之士和美國國家标準協會為了使這個語言健康地發展下去,決定成立C标準委員會,建立C語言的标準。委員會由硬體廠商,編譯器及其他軟體工具生産商,軟體設計師,顧問,學術界人士,C語言作者和應用程式員組成。1989年,ANSI釋出了第一個完整的C語言标準——ANSI X3.159—1989,簡稱“C89”,不過人們也習慣稱其為“ANSI C”。C89在1990年被國際标準組織ISO(International Organization for Standardization)一字不改地采納,ISO官方給予的名稱為:ISO/IEC 9899,是以ISO/IEC9899: 1990也通常被簡稱為“C90”。1999年,在做了一些必要的修正和完善後,ISO釋出了新的C語言标準,命名為ISO/IEC 9899:1999,簡稱“C99”。 在2011年12月8日,ISO又正式釋出了新的标準,稱為ISO/IEC9899: 2011,簡稱為“C11”。

C語言标準:

K&R C

起初,C語言沒有官方标準。1978年由美國電話電報公司(AT&T)貝爾實驗室正式發表了C語言。布萊恩·柯林漢(Brian Kernighan) 和 丹尼斯·裡奇(Dennis Ritchie) 出版了一本書,名叫《The C Programming Language》。這本書被 C語言開發者們稱為K&R,很多年來被當作 C語言的非正式的标準說明。人們稱這個版本的 C語言為K&R C。[3]

K&R C主要介紹了以下特色:

  1. 結構體(struct)類型
  2. 長整數(long int)類型
  3. 無符号整數(unsigned int)類型
  4. 把運算符=+和=-改為+=和-=。因為=+和=-會使得編譯器不知道使用者要處理i = -10還是i =- 10,使得處理上産生混淆。

即使在後來ANSI C标準被提出的許多年後,K&R C仍然是許多編譯器的最标準要求,許多老舊的編譯器仍然運作K&R C的标準。

ANSI C / C89标準

1970到80年代,C語言被廣泛應用,從大型主機到小型微機,也衍生了C語言的很多不同版本。

1983年,美國國家标準協會(ANSI)成立了一個委員會X3J11,來制定 C語言标準。

1989年,美國國家标準協會(ANSI)通過了C語言标準,被稱為ANSI X3.159-1989 "Programming Language C"。因為這個标準是1989年通過的,是以一般簡稱C89标準。有些人也簡稱ANSI C,因為這個标準是美國國家标準協會(ANSI)釋出的。

1990年,國際标準化組織(ISO)和國際電工委員會(IEC)把C89标準定為C語言的國際标準,命名為ISO/IEC 9899:1990 - Programming languages -- C。因為此标準是在1990年釋出的,是以有些人把簡稱作C90标準。不過大多數人依然稱之為C89标準,因為此标準與ANSI C89标準完全等同。

1994年,國際标準化組織(ISO)和國際電工委員會(IEC)釋出了C89标準修訂版,名叫ISO/IEC 9899:1990/Cor 1:1994 ,有些人簡稱為C94标準。

1995年,國際标準化組織(ISO)和國際電工委員會(IEC)再次釋出了C89标準修訂版,名叫ISO/IEC 9899:1990/Amd 1:1995 - C Integrity ,有些人簡稱為C95标準。

C99标準

1999年1月,國際标準化組織(ISO)和國際電工委員會(IEC)釋出了C語言的新标準,名叫ISO/IEC 9899:1999 - Programming languages -- C,簡稱C99标準。這是C語言的第二個官方标準。

在C99中包括的特性有:

  1. 增加了對編譯器的限制,比如源程式每行要求至少支援到 4095 位元組,變量名函數名的要求支援到 63 位元組(extern 要求支援到 31)。
  2. 增強了預處理功能。例如:
  3. 宏支援取可變參數 #define Macro(...) __VA_ARGS__
  4. 使用宏的時候,允許省略參數,被省略的參數會被擴充成空串。
  5. 支援 // 開頭的單行注釋(這個特性實際上在C89的很多編譯器上已經被支援了)
  6. 增加了新關鍵字 restrict, inline, _Complex, _Imaginary, _Bool
  7. 支援 long long, long double _Complex, float _Complex 等類型
  8. 支援不定長的數組,即數組長度可以在運作時決定,比如利用變量作為數組長度。聲明時使用 int a[var] 的形式。不過考慮到效率和實作,不定長數組不能用在全局,或 struct 與 union 裡。
  9. 變量聲明不必放在語句塊的開頭,for 語句提倡寫成 for(int i=0;i<100;++i) 的形式,即i 隻在 for 語句塊内部有效。
  10. 允許采用(type_name){xx,xx,xx} 類似于 C++ 的構造函數的形式構造匿名的結構體。
  11. 複合字面量:初始化結構的時候允許對特定的元素指派,形式為:
  12. struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 };
  13. struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5 }; // 3,4 是對 .c,.d 指派的
  14. 格式化字元串中,利用 \u 支援 unicode 的字元。
  15. 支援 16 進制的浮點數的描述。
  16. printf scanf 的格式化串增加了對 long long int 類型的支援。
  17. 浮點數的内部資料描述支援了新标準,可以使用 #pragma 編譯器指令指定。
  18. 除了已有的 __line__ __file__ 以外,增加了 __func__ 得到目前的函數名。
  19. 允許編譯器化簡非常數的表達式。
  20. 修改了 /% 處理負數時的定義,這樣可以給出明确的結果,例如在C89中-22 / 7 = -3, -22% 7 = -1,也可以-22 / 7= -4, -22% 7 = 6。 而C99中明确為 -22 / 7 = -3, -22% 7 = -1,隻有一種結果。
  21. 取消了函數傳回類型預設為 int 的規定。
  22. 允許 struct 定義的最後一個數組不指定其長度,寫做 [](flexible array member)。
  23. const const int i 将被當作 const int i 處理。
  24. 增加和修改了一些标準頭檔案,比如定義 bool 的 <stdbool.h> ,定義一些标準長度的 int 的 <inttypes.h> ,定義複數的 <complex.h> ,定義寬字元的 <wctype.h> ,類似于泛型的數學函數 <tgmath.h>, 浮點數相關的 <fenv.h>。 在<stdarg.h> 增加了 va_copy 用于複制 ... 的參數。裡增加了 struct tmx ,對 struct tm 做了擴充。
  25. 輸入輸出對寬字元以及長整數等做了相應的支援。

但是各個公司對C99的支援所表現出來的興趣不同。GCC和其它一些商業編譯器支援C99的大部分特性,微軟和Borland卻似乎對此不感興趣。

C11标準

2011年12月8日,國際标準化組織(ISO)和國際電工委員會(IEC)再次釋出了C語言的新标準,名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C ,簡稱C11标準,原名C1X。這是C語言的第三個官方标準,也是C語言的最新标準。

新的标準提高了對C++的相容性,并增加了一些新的特性。這些新特性包括:

  1. 對齊處理(Alignment)的标準化(包括_Alignas标志符,alignof運算符, aligned_alloc函數以及<stdalign.h>頭檔案。
  2. _Noreturn 函數标記,類似于 gcc 的 __attribute__((noreturn))。
  3. _Generic 關鍵字。
  4. 多線程(Multithreading)支援,包括:
  5. _Thread_local存儲類型辨別符,<threads.h>頭檔案,裡面包含了線程的建立和管理函數。
  6. _Atomic類型修飾符和<stdatomic.h>頭檔案。
  7. 增強的Unicode的支援。基于C Unicode技術報告ISO/IEC TR 19769:2004,增強了對Unicode的支援。包括為UTF-16/UTF-32編碼增加了char16_t和char32_t資料類型,提供了包含unicode字元串轉換函數的頭檔案<uchar.h>.
  8. 删除了 gets() 函數,使用一個新的更安全的函數gets_s()替代。
  9. 增加了邊界檢查函數接口,定義了新的安全的函數,例如 fopen_s(),strcat_s() 等等。
  10. 增加了更多浮點處理宏。
  11. 匿名結構體/聯合體支援。這個在gcc早已存在,C11将其引入标準。
  12. 靜态斷言(static assertions),_Static_assert(),在解釋 #if 和 #error 之後被處理。
  13. 新的 fopen() 模式,(“…x”)。類似 POSIX 中的 O_CREAT|O_EXCL,在檔案鎖中比較常用。
  14. 新增 quick_exit() 函數作為第三種終止程式的方式。當 exit()失敗時可以做最少的清理工作。

來源: <http://baike.baidu.com/link?url=gNUFCCorwpgZJaNtM00nh6-3T7eI4OKI2fIQ1nKLpJx1A6Nu9Vlrm8uS7s9gQvJzVqRR0jYCO8_QNmU2fA5ic_>

C++語言發展大概可以分為三個階段:

  1. 第一階段從80年代到1995年。這一階段C++語言基本上是傳統類型上的面向對象語言,并且憑借着接近C語言的效率,在工業界使用的開發語言中占據了相當大份額;
  2. 第二階段從1995年到2000年,這一階段由于标準模闆庫(STL)和後來的Boost等程式庫的出現,泛型程式設計在C++中占據了越來越多的比重性。當然,同時由于Java、C#等語言的出現和硬體價格的大規模下降,C++受到了一定的沖擊;
  3. 第三階段從2000年至今,由于以Loki、MPL等程式庫為代表的産生式程式設計和模闆元程式設計的出現,C++出現了發展曆史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程式設計語言中最複雜的一員。

以下是C++發展年代清單:

  1. 在“C with Class”階段,研制者在C語言的基礎上加進去的特征主要有:類及派生類、共有和私有成員的區分、類的構造函數和析構函數、友元、内聯函數、指派運算符的重載等。
  2. 1985年公布的的C++語言1.0版的内容中又添加了一些重要特征:虛函數的概念、函數和運算符的重載、引用、常量(constant)等。
  3. 1989年推出的2.0版形成了更加完善的支援面向對象程式設計的C++語言,新增加的内容包括:類的保護成員、多重繼承、對象的初始化與指派的遞歸機制、抽象類、靜态成員函數、const成員函數等。
  4. 1993年的C++語言3.0版本是C++語言的進一步完善,其中最重要的新特征是模闆(template),此外解決了多重繼承産生的二義性問題和相應的構造函數與析構函數的處理等。
  5. 1998年C++标準(ISO/IEC14882 Standard for the C++ Programming Language)得到了國際标準化組織(ISO)和美國标準化協會(ANSI)的準許,标準C++語言及其标準庫更展現了C++語言設計的初衷。名字空間的概念、标準模闆庫(STL)中增加的标準容器類、通用算法類和字元串類型等使得C++語言更為實用。此後C++是具有國際标準的程式設計語言,該标準通常簡稱ANSI C++或ISO C++ 98标準,以後每5年視實際需要更新一次标準。
  6. 後來又在2003年通過了C++标準第二版(ISO/IEC 14882:2003):這個新版本是一次技術性修訂,對第一版進行了整理——修訂錯誤、減少多義性等,但沒有改變語言特性。這個版本常被稱為C++03。[2]
  7. 此後,新的标準草案叫做C++ 0x。對于C++ 0x标準草案的最終國際投票已于2011年8月10日結束,并且所有國家都投出了贊成票,C++0x已經毫無疑義地成為正式國際标準。先前被臨時命名為C++0x的新标準正式定名為ISO/IEC 14882:2011,簡稱ISO C++ 11标準。C++ 11标準将取代現行的C++标準C++98和C++03。國際标準化組織于2011年9月1日出版釋出《ISO/IEC 14882:2011》,名稱是:Information technology -- Programming languages -- C++ Edition: 3。

來源: <http://baike.baidu.com/view/824.htm?fromtitle=c%2B%2B語言&fromid=4102088&type=syn>

語言的發展是一個逐漸遞進的過程,C++ 是直接從 C 語言發展過來的,而 C 語言是從 B 語言發展過來的,B 語言是 BCPL 的一個解釋性後代,BCPL 是 Basic CPL。其中最有趣的是 CPL 中 C 的由來,由于當時這個語言是劍橋大學和倫敦大學合作開發的,在倫敦的人員加入之前,C 表示劍橋,倫敦人員加入之後,C 表示 Combined 組合。還有一種非正式的說法,C 表示 Christopher,因為 Christopher 是 CPL 背後的主要動力。

最初導緻C++誕生的原因是在Bjarne博士等人試圖去分析UNIX的核心的時候,這項工作開始于1979年4月,當時由于沒有合适的工具能夠有效的分析由于核心分布而造成的網絡流量,以及怎樣将核心子產品化。同年10月,Bjarne博士完成了一個可以運作的預處理程式,稱之為Cpre,它為C加上了類似Simula的類機制。在這個過程中,Bjarne博士開始思考是不是要開發一種新的語言,當時貝爾實驗室對這個想法很感興趣,就讓Bjarne博士等人組成一個開發小組,專門進行研究。

當時不是叫做C++,而是C with class,這是把它當作一種C語言的有效擴充。由于當時C語言在程式設計界居于老大的地位,要想發展一種新的語言,最強大的競争對手就是C語言,是以當時有兩個問題最受關注:C++要在運作時間、代碼緊湊性和資料緊湊性方面能夠與C語言相媲美,但是還要盡量避免在語言應用領域的限制。在這種情況下,一個很自然的想法就是讓C++從C語言繼承過來,但是我們的Bjarne博士更具有先見之明,他為了避免受到C語言的局限性,參考了很多的語言,例如:從Simula繼承了類的概念,從Algol68繼承了運算符重載、引用以及在任何地方聲明變量的能力,從BCPL獲得了//注釋,從Ada得到了模闆、名字空間,從Ada、Clu和ML取來了異常。

來源: <http://c.biancheng.net/cpp/biancheng/view/1.html>

C++語言标準:

不是叫做C

C++ 98 标準

C++标準第一版,1998年釋出。正式名稱為ISO/IEC 14882:1998[18] 。

絕大多數編譯器都支援C++98标準。不過當時錯誤地引入了export關鍵字。由于技術上的實作難度,除了Comeau C++編譯器export關鍵字以外,沒有任何編譯器支援export關鍵字。并且這個标準對現代的一些編譯理念有相當的差距,有很多在進階語言都應當有的功能,它都沒有。這也正是後來需要制定C++11标準的原因所在。

C++ 03 标準

C++标準第二版,2003年釋出。正式名稱為ISO/IEC 14882:2003[19] 。這個标準僅僅是C++98修訂版,與C++98幾乎一樣,沒做什麼修改。僅僅是對C++98做了一些“勘誤”,就連主流編譯器(受C99标準影響)都已支援的long long都沒有被加入C++03标準。

C++ 11 标準

C++标準第三版,2011年8月12日釋出。正式名稱為ISO/IEC 14882:2011[20] 。

由C++标準委員會于2011年8月12日公布,并于2011年9月出版。2012年2月28日的國際标準草案(N3376)是最接近于現行标準的草案(編輯上的修正)。C++11包含了核心語言的新機能,并且拓展C++标準程式庫,并且加入了大部分的C++ Technical Report 1程式庫(數學上的特殊函數除外)。此次标準為C++98釋出後13年來第一次重大修正。

注意: C++11标準(ISO/IEC 14882:2011)與C11标準(ISO/IEC 9899:2011)是兩個完全不同的标準,後者是C語言的标準。

C++ 14 标準

C++标準第四版,2014年8月18日釋出。正式名稱為ISO/IEC 14882:2014[21] 。

2014年8月18日,ISO組織在其網站上釋出文章稱:

C++ 作者 Bjarne Stroustrup 稱,主要的編譯器開發商已經實作了 C++ 14 規格。

C++ 14 是 C++ 11 的增量更新,主要是支援普通函數的傳回類型推演,泛型 lambda,擴充的 lambda 捕獲,對 constexpr 函數限制的修訂,constexpr變量模闆化等等。

C++14是C++語言的最新标準,正式名稱為"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。C++14旨在作為C++11的一個小擴充,主要提供漏洞修複和小的改進。C++14标準的委員會草案(Committee Draft)N3690于2013年5月15日發表。工作草案(Working Draft)N3936已于2014年3月02日完成。最終的投票期結束于2014年8月15日,結果(一緻通過)已于8月18日公布。

如何了解C++?《摘自Effective C++》

C++已經是個多重範型程式設計語言(multiparadigm programming language),一個同僚支援過程形式(procedural)、面向對象形式(object-oriented)、函數形式(functional)、範型形式(generic)、元程式設計形式(metaprogramming)的語言。

如何了解這樣一個語言?

将C++視為一個由相關語言組成的聯邦而非單一語言,在其某個次語言中,各種守則與通例都傾向簡單、直覺易懂、并且容易記住。

C++的4個次語言:

  1. C :          C++以C為基礎。區塊(blocks)、語句(statements)、預處理器(preprocessor)、内置資料類型(built-in data types)、數組(arrays)、指針(pointers)等都來自C。
  2. Object-oriented C ++ :        類(class)、封裝(encapsulation)、繼承(inheritance)、多态(polymorphism)、虛函數(virtual function)等都是面向對象設計在C++上的最直接實施。
  3. Template C++ (generic programming) :        C++的範型程式設計(generic programming)部分。他們帶來新的程式設計範型(programming paradigm),也就是所謂的template meta programming(TMP,模闆元程式設計)。
  4. STL:        即template程式庫,對容器、疊代器、算法以及函數對象的規約有極佳的緊密配合與協調。

C++并不是一個帶有一組守則的一體語言,而是由4個次語言組成的聯邦語言,每個次語言都有自己的規約。

remember

C++高效程式設計守則視狀況而變化,取決于你使用C++的哪一部分。

來源: <http://blog.csdn.net/livelylittlefish/article/details/5729847>

再也不敢輕易聲稱自己是個C++程式員了,無知者無畏,果然是呀

c 标準和c++标準

C++與C的關系

C語言是C++的基礎,C++和C語言在很多方面是相容的。

C語言是一個結構化語言,它的重點在于算法與資料結構。C程式的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實作過程(事物)控制)。C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過擷取對象的狀态資訊得到輸出或實作過程(事物)控制。是以C語言和C++的最大差別在于它們解決問題的思想方法不一樣。

C++對C的“增強”,表現在六個方面:

  • (1) 類型檢查更為嚴格。
  • (2) 增加了面向對象的機制。
  • (3) 增加了泛型程式設計的機制(Template)。
  • (4) 增加了異常處理。
  • (5) 增加了運算符重載。
  • (6) 增加了标準模闆庫(STL)。

與C不相容之處

C++一般被認為是C的超集合(Superset),但這并不嚴謹。大部分的C代碼可以很輕易的在C++中正确編譯,但仍有少數差異,導緻某些有效的C代碼在C++中失效,或者在C++中有不同的行為。

  1. 最常見的差異之一是,C允許從void*隐式轉換到其它的指針類型,但C++不允許。
  2. 另一個常見的可移植問題是,C++定義了新關鍵字,例如如new,class,它們在C程式中可以作為識别字(例:變量名)的。
  3. 在C标準(C99)中去除了一些不相容之處,也支援了一些C++的特性,如//注解,以及在代碼中混合聲明。不過C99也納入幾個和C++沖突的新特性(如:可變長度數組、原生複數類型和複合逐字常數)。

若要混用C和C++的代碼,則所有在C++中調用的C代碼,必須放在 extern "C" { } 内。