c11

它引入了和 C++11 一樣的 memory model 和跨平台 lockfree programming 用的 stdatomic.h [1](他們設計時就是打算同一套模型,一套 template like API 給 C++ 用,一套 function like API 給 C 用)

此 memory model 最重要的功能是讓『寫最佳化編譯器的人』跟『寫 multithreading code 的人』之間終於有了可行的 contract,能夠解決如:
http://www.airs.com/blog/archives/79
中『哪些最佳化是合法的』的爭議。但這種改變沒有 API,使用者看不到,且主要編譯器都是在還沒實作 C11 的新 API 之前就先(部份)改了這邊。

2. Static assertions 聽起來不錯,有希望簡化 https://lwn.net/Articles/226007/

Anonymous structs and unions, _Alignas, _Noreturn 等是 gcc 既有的 extension 標準化。這邊討厭的是 Visual C++ 不跟,所以實務上簡化到的有限。

3. > 文中沒提到 string 相關函式是否有正確處理 unicode, 我覺得最重要的是這件事

這句話觀念有點怪。
假設你想操作記憶體中的 UTF8:
string.h 與 ctypes.h 中既有的函式不能改成接受 UTF8 因為會不回溯相容。且舊 API 設計上有很多地方假設 character 大小固定。

操作 UTF8 的 API 設計如:http://developer.gnome.org/glib/stable/glib-Unicode-Manipulation.html
你瞄一下就知道差別:無法 random access 而要有 {next,prev}_char(), UTF8 要搜與 index 前要考慮 normalization、要能夠在 utf32 與 utf8 間互轉等。

假設你是想操作 UTF16 或 UTF32:
C standard 中既有的 wchar_t 相關函式 (wchar.h) 因當年『反 Unicode 人士』的努力所以接近廢物。(API 設計上要求是 encoding independent 所以在 Unicode 軟體內不合理的難用、在 Windows 上是 2 byte, 在 Linux 上是 4 byte)

其實 C++11 / C11 新增的 UTF8, 16, 32 string literal 因為需要 compiler support 所以還是滿有用的。(Visual C++ 2012 還沒實作,但因在 C++11 內,至少有希望?) : full source reference

Reference

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License