標籤:

為什麼 C 語言中的一些特性不被 C++ 支持?

有哪個少量特性不支持?能列舉一下及簡明其作用?c++不支持是因為這些(少量特性)與c++有衝突原因嗎?還是與c++中的已實現的有重合?還是編譯器在實現方法很難做到平衡優化?

=======

一些文章或者說法 "c++與c 幾乎兼容,只有少量特性不支持",但都沒有人 闡述這其中原由。(c++與c幾乎兼容,就少量特性不支持)一提到這兩個老哥們的聯繫時這句話就是「萬金油」


Compatibility of C and C++

http://www.stroustrup.com/sibling_rivalry.pdf

C and C++: Siblings by Bjarne Stroustrup

其實就是政治原因,C 標準委員會的人跟C++標準會員會重合度不高(而且據說C99標準會員會的人和C89的重合度也不高),C++ 熱臉貼了 C 的冷屁股。

C++98 倒是盡量保持和 C89 兼容,但是 C99 故意搞得和 C++98 不兼容,例如引入 _Bool 類型,而不是使用 C++ 定義的 bool 類型。類似的還有 const,C++ 的 const 全局變數大致等於 C 的 static const 全局變數。(To language lawyer: 不要跟我這兒提「C 沒有全局變數"了,OK?)

C 語言里 sizeof("a") == sizeof(int),而 C++ 里 sizeof("a") == sizeof(char) == 1。

C 語言里 void f() == void f(...),而 C++ 里 void f() == void f(void) 。

C 語言里多個 .c 文件可以放全局的 int x; (無初值) ,而 C++ 會認為重複定義。


看看《c++語言的設計和演化》


參見ISO C++ C.1。

例如

- "x"類型不同是為了重載

- void*向O*的隱式轉換被禁止是為了類型安全

- ?: = ,的結果可以是左值是因為「C++ is an object-oriented language, placing relatively more emphasis on lvalues.」有些不明所以。

- 除了typedef struct s { } s;之外,不允許一個typedef name是已經定義的結構標籤是因為在C++中類類型可以不帶struct/class/union。

- 不允許整數類型到枚舉的隱式轉換是為了安全。

等等。


最容易理解的,new、class這些c++里遍地可見的保留字在c里不是保留字,所以可以當變數名。用了這種變數名的c代碼c++肯定不認了。


多謝各位的回答

這裡 http://stackoverflow.com/questions/1201593/c-subset-of-c-where-not-examples

正好比較不錯專門計論了 c與c++ 不兼容的那一部分少量特性的事情,,有興趣的可以看看。


推薦閱讀:

C 語言有沒有REPL啊?
如何評價《王垠:C 編譯器優化過程中的 Bug》?
C語言(GCC)如何編譯多個文件?
C 語言用 gcc 和 vs2013 編譯有什麼區別?

TAG:C編程語言 | C | CC |