1. C
時間 | 名稱 | 標准制定組織 | 事件 |
1978 | K&R標准 | K&R |
《The C Programming Language》
author: K&R
|
1989 | ANSI C / C89 | ANSI | ANSI通過C語言標准 |
1990 | C90 | ISO & IEC | ISO&IEC將C89標准定為C語言國際標准 |
1994 | C94 | ISO & IEC | ISO&IEC發布C89標准修訂版,即C94 |
1995 | C95 | ISO & IEC | ISO&IEC發布C94標准修訂版,即C95 |
1999 | C99 | ISO & IEC | ISO&IEC發布C語言新標准,即C99。這是C語言第二個標准 |
2011 | C11 | ISO & IEC | ISO&IEC發布C語言新標准,即C11。這是C語言第三個標准 |
C標准庫 實現
1). GNU/Linux版實現:glibc.so(注:Linux中被重命名為libc.so。原因:所有Linux庫都必須以lib前綴打頭)
2). Mac和iOS實現:
Mac中,C標准庫的實現是libSystem(/usr/lib/libSystem.dylib)的一部分;
iOS可以使用 iOS SDK來訪問標准庫;
3). Windows版實現:
在Windows上,標准庫的實現一直嚴格限定在 Visual Studio中,它是微軟官方編譯器。他們通常稱之為C/C++運行時庫(CRT),並且它涵蓋了C/C++二者的實現。名為 CRTDLL.DLL。
從 Windows 95開始,Microsoft開始將其遷移到MSVCRT[版本號].DLL之上。例:MSVCR71.DLL
在1997年左右,他們決定將文件名簡化為MSVCRT.DLL,這導致了
DLL混亂。因此從 Visual Studio 7.0開始,他們切換回每個版本使用單獨的DLL了。
Visual Studio 2015引入了深度 CRT 重構。C/C++ 標准庫的實現遷移到一個新庫, Universal C運行時庫(Universal CRT 或 UCRT),編譯為 UCRTBASE.DLL。
4). Android版實現:
Bionic是Google為其Android操作系統所編寫的C標准庫實現,它直接在底層使用。第三方開發者可以通過Android NDK訪問 Bionic,Android NDK允許開發者使用 C/C++代碼編寫Android應用程序。
2. C++
時間 | 名稱 | 標准制定組織 | 事件 |
1998 | C++ 98 標准 | ISO & IEC | 1998年C++標准得到ISO和ANSI批准。 以后每5年視實際需要更新一次。 |
2003 | C++ 03 標准 | ISO & IEC | 2003年通過了C++標准第二版。 |
2011 | C++ 11 標准 | ISO & IEC | 2011年發布了C++標准第四版C++ 11,取代現行的C++ 98 和 C++ 03。 此次標准為 C++ 98發布13年來第一次重大修正。 |
2014 | C++ 14 標准 | ISO & IEC | 2014年發布了C++標准第四版C++ 14, 是 C++ 11的增量更新。 |
C++標准庫 實現
1). GNU/Linux版實現:libstdc++
2). Mac和iOS實現:
Mac中,Mac OS < V10.9, libstdc++是默認選項;Mac OS >= V10.9,使用 libc++(注1:這是LLVM項目所引人的 GNU libstdc++ 的替代;注2:LLVM是Mac官方編譯器框架)
iOS可以使用 iOS SDK來訪問標准庫;
3). Windows版實現:
在Windows上,標准庫的實現一直嚴格限定在 Visual Studio中,它是微軟官方編譯器。他們通常稱之為C/C++運行時庫(CRT),並且它涵蓋了C/C++二者的實現。名為 CRTDLL.DLL。
從 Windows 95開始,Microsoft開始將其遷移到MSVCRT[版本號].DLL之上。例:MSVCR71.DLL
在1997年左右,他們決定將文件名簡化為MSVCRT.DLL,這導致了
DLL混亂。因此從 Visual Studio 7.0開始,他們切換回每個版本使用單獨的DLL了。
Visual Studio 2015引入了深度 CRT 重構。C/C++ 標准庫的實現遷移到一個新庫, Universal C運行時庫(Universal CRT 或 UCRT),編譯為 UCRTBASE.DLL。
4). Android版實現:
對C++標准庫,Android NDK提供了很多版本的實現:
libc++。從 Lollipop 開始的官方安卓系統和現代 Mac OS 都將其作為 C++ 標准庫使用。從NDK v17開始,它將成為NDK中唯一可用的 C++ 標准庫實現。
gnustl。libstdc++的別名,這兩者在GNU/Linux中同一個庫。該庫已被棄用,它將在NDK v18中刪除。
STLport。由STLport項目編寫的C++標准庫的第三方實現,自2008年開始一直處於不活躍狀態。與gnustl一樣,STLport將在NDK v18種移除。
補充重點:C++與C的不兼容
1. 最常見的差異之一是,C 允許從 void * 隱式轉換到其他指針類型,但C++不允許。
2. 另一個常見的可移植問題是,C++重新定義了關鍵字,如 new, class,它們在C程序中可以作為識別字(例:變量名)的。
3. 在C標准(C99)中去除了一些不兼容之處,也支持了一些C++的特性,如注解,以及在代碼中混合聲明。不過C99也納入了幾個和C++沖突的特性(如:可變長度數組、原生復數類型和復合逐字常數)。
若要混用C和C++的代碼,則所有在C++中調用的C代碼,必須放在 extern “C”{/*C代碼*/}內。
參考資料: