為什麼C語言不引入類這種語法?
12-30
為什麼C標準不把C++的語法吸納進來,而要讓C和C++呈現分立的局面
引入語法就類似於連坐。我舉個例子,你要class沒關係,java和c#的class都很純粹。但是一旦你想要一個類型同時是class和值類型(畢竟C語言追求效率是不是),那你就會需要:
- 一大堆構造函數和複製函數,不然就不能充分榨乾所有情況下的性能。new出來的東西是什麼,是指針嗎,還是句柄?如果是指針的話,是否要考慮支持引用計數,還是要考慮GC,還是乾脆可以讓用戶自己選?
- 引用:畢竟operator=返回的值是可以被賦值的對不對:(a=b)=c;
- 如果有構造函數,那麼operator=和析構函數都必須可以自定義。如果沒有構造函數——那還叫class?
- 都有operator=了,要不要支持其他操作符?
- 模板:沒有模板的語言如今都被人噴出了翔,就連C語言也加入那個奇葩的類型選擇宏。而且你已經有值類型了,要是值類型不能當容器用,那要class支持值類型幹什麼?連個字元串都寫不出來(逃。但是有了容器,你想跟Delphi一樣,每個類型的列個表都要重新寫一次嗎?肯定不想,所以要模板。
- 想不想要帶引用計數的指針?除了C語言以外,這些語言要麼有GC,要麼有引用計數,C語言不能啥都沒有吧?引用計數的指針是只能new出來呢還是可以直接塞一個指針進去?C語言這麼在乎性能你要不要把引用計數跟類本身打包在同一段連續內存裡面(std::make_shared)?都搞得這麼複雜了,引用計數的指針到底是要編譯器實現呢,還是允許用戶自己實現?萬一引用計數是類本身提供的怎麼辦(如COM對象)?——什麼,你想讓類庫自己實現引用計數的指針?好吧你還是得要模板(逃
- 有了模板你就會想要lambda表達式,你就還需要引入類似std::function這樣的東西,然後你就被迫需要偏特化,這個就不過多解釋了,說不完。
然後整個C++就被你帶進來了,就因為你既想要class也想要值類型。不如直接刪掉C語言,就用C++。你看java就乾脆沒有struct,而C#的struct跟class就劃清界限。
你完全可以把c++寫成c,只用你想用的語法就行了
新歇後語:豬鼻子插大蔥=安裝對象?
因為引入之後會變成「另一個C++」。
GObject和vala默默注視著你
struct 不夠?用typedef?不能解決實際問題?用函數指針還不夠?
寫宏總夠了吧?
還不夠?看來只是你基本功不夠。objective-c滿足你,話說不是特殊情況只能用c,為什麼要去用c寫代碼,你不怕浪費時間?
引入不解決問題啊。引入完了,為了兼容舊編譯器,你還是要區分「舊C」和「新C」
推薦閱讀:
※Linux內核應該怎麼去學習?
※問一個函數指針問題?
※自學c語言,有什麼好的建議或方法嗎?
※C++標準庫中有哪些危險函數?
※如何學好編程語言以及進行軟體開發?