1. 程式人生 > >C語言的C11 標準有哪些改進的地方?C11 為何不如 C++11 流行?

C語言的C11 標準有哪些改進的地方?C11 為何不如 C++11 流行?

1、   C語言的C11 標準有哪些改進的地方?會對各類C專案起到哪些幫助?

1. 對齊處理操作符 alignof,函式 aligned_alloc(),以及 標頭檔案 <stdalign.h>。
2. _Noreturn 函式標記,類似於 gcc 的 __attribute__((noreturn))。
3. _Generic 關鍵詞,有點兒類似於 gcc 的 typeof。
4. 靜態斷言( static assertions),_Static_assert(),在解釋 #if 和 #error 之後被處理。
5. 刪除了 gets() 函式,C99中已經將此函式被標記為過時,推薦新的替代函式 gets_s()。
6. 新的 fopen() 模式,(“…x”)。類似 POSIX 中的 O_CREAT|O_EXCL,在檔案鎖中比較常用。
7. 匿名結構體/聯合體,這個早已經在 gcc 中了,我們並不陌生,定義在 6.7.2.1 p13。
8. 多執行緒支援,包括:_Thread_local,標頭檔案 <threads.h>,裡面包含執行緒的建立和管理函式(比如 thrd_create(),thrd_exit()),mutex (比如 mtx_lock(),mtx_unlock())等等,更多內容清參考 7.26 節。
9. _Atomic型別修飾符和 標頭檔案 <stdatomic.h>,見 7.17 節。
10. 帶邊界檢查(Bounds-checking)的函式介面,定義了新的安全的函式,例如 fopen_s(),strcat_s() 等等。更多參考 Annex K。
11. 改進的 Unicode 支援,新的標頭檔案 <uchar.h> 等。
12. 新增 quick_exit() 函式,作為第三種終止程式的方式,當 exit() 失敗時可以做最少的清理工作(deinitializition),具體見 7.22.4.7。
13. 建立複數的巨集, CMPLX()
14. 更多浮點數處理的巨集 (More macros for querying the characteristics of floating point types, concerning subnormal floating point numbers and the number of decimal digits the type is able to store)。
15. struct timespec 成為 time.h 的一部分,以及巨集 TIME_UTC,函式 timespec_get()。
這些改進的地方對程式設計師來說增加了不少的功能,可以減少原來自己實現的一些功能程式碼。

2、   C11 為何不如 C++11 流行?如果說微軟對 C 不感興趣,還可以理解。畢竟Windows 上 C++ 的更多。但開源社群 C 才是一等公民,為何新標準沒有成為主流呢?


C++11的改進:
1.對C++核心語言的擴充
2.核心語言執行期的強化(右值引用和 move 語義;泛化的常數表示式;對POD定義的修正)
3.核心語言建構期表現的加強(外部模板)
4.核心語言使用性的加強(初始化列表;統一的初始化;型別推導[auto關鍵字];以範圍為基礎的 for 迴圈;Lambda函式與表示法;另一種的函式語法;物件構建的改良;顯式虛擬函式過載;空指標;強型別列舉;角括號;顯式型別轉換;模板的別名;無限制的unions)
5.核心語言能力的提升(變長引數模板;新的字串字面值;使用者自定義的字面值;多工儲存器模型;thread-local的儲存期限;使用或禁用物件的預設函式;long long int 型別;靜態assertion;允許sizeof運算子作用在型別的資料成員上,無需明確的物件

6.C++標準程式庫的變更(標準庫元件的升級;執行緒支援;多元組型別;散列表;正則表示式;通用智慧指標;可擴充套件的隨機數功能;包裝引用;多型函式物件包裝器;用於超程式設計的型別屬性;用於計算函式物件返回型別的統一方法)
不管怎麼說,C++是面向物件的程式語言,在當前的大環境中,面向物件還是一個主流的開發。雖然說C在開源社群是一等公民。但畢竟C的就業範圍比較小。不如面嚮物件語言這麼廣泛。

3、   最讓C程式設計師恐懼的C++特性是哪一個?哪個C++擁有而C沒有的feature是你認為弊大於利的呢? 或者說, 哪個C++有而C沒有的pitfall是你無法接受的?
面向物件。

4、   C、Scheme、Lua 和 Go 究竟哪個最簡單(最易上手/複雜度最低/最易精通)?

覺得還是C吧。