C++無法取代C嗎?

都說C的功能C++全都有,那C的存在還有什麼意義?有沒有可能創造出一種語言,集所有語言的特點於一身呢?然後用的時候就用那一部分的特點就好啦(不是這個專業的,問得可能有點幼稚……)


1,c可控。c裡面的東西是程序員可以掌控的,c++很多不行。比如struct定義好之後,可以方便的跟其他語言互通,命名也是定的。

c編譯成彙編很簡潔,c++的比較複雜。

可控,那麼多 UB 跟我談可控?彙編好意思談什麼簡潔。要是翻譯成彙編越簡潔越好,為什麼不直接寫彙編?

2,c可讀性高。c沒有太多的特性,看到代碼就能知道在幹嘛。

C 語言混亂代碼大賽直接打臉。

看到一段代碼,往往不是看到的這麼簡單,要看很多頭文件,才能搞清楚代碼到底在做啥。

抱歉,頭文件的糟粕是從 C 繼承過來的

大家仔細研究c++的特性,其實不少是在打補丁,之前特性引入一些問題,

然後又出一些特性來彌補之前的問題。

C 就不是了?_Bool 是什麼鬼?

5,c++的特性對c來說沒有特別有用的,比如class來說,c可以用struct實現,雖然寫代碼麻煩點,但這點麻煩不影響性能,

Java/C# 躺槍。像這種人打回去重修軟體工程。

C 的特性對於彙編來說沒有特別有用的,比如 for/while 來說,X86 彙編可以用 jmp 實現,雖然寫代碼麻煩點,但這點麻煩不影響性能。(模仿語文不好的人說話自己都羞恥)。

像這種辣雞答案都這麼多贊,可見知乎水平。


說了那麼多,但是那些堅守C陣營的程序員,用的C編譯器沒有一個不是用C++寫的(逃。從這個角度上來說,只有兩種結果:

C語言完蛋

C和C++一起完蛋


必須使用C的場景主要都是涉及到二進位連接或者跨語言調用,因為C的調用規範通常兼容或部分兼容其他許多語言和組件,比如C++, CPython, Node, Linux內核等;而C++有一些注意事項,例如extern "C",還有不兼容thiscall。這樣需要跨語言調用的時候總是用純C更安全可靠一些。另一方面,要連接到的許多庫本身就是C編寫的,用C寫能更容易保證兼容,防止出現對齊不一致、多出來虛函數表之類的尷尬局面。並不是說用C++做不了這些,C++只要遵循特定的規則也可以兼容,但遵循這些規則通常就意味著和直接寫C差不多了。

比如說最近看的GRPC,它的C/C++實現就是用C實現了一個core,然後用戶介面是C++的,其他語言如Python、PHP都直接調用C的core。

其他一些次要的理由包括C不需要鏈接太多的庫,C更利於精細規劃內存使用,以及程序員的喜好和逼格等。


  1. 因為 ABI 問題,給 gcc 版本 4.8 以下的 Linux 系統寫程序,我選 C
  2. 很多嵌入式平台只有 C 編譯器
  3. 有 Rust 的時候,我選 Rust
  4. 給 Linux 寫 GUI,我選 Vala
  5. 其他時候選 C++


寒冰箭完爆暗色炸彈嗎?

偶爾,總有那麼一點情況功能多會變成累贅。

比如:


嵌入式,很多場合只能用C吧。

比如早幾年的單片機一般都是幾k的flash,幾百位元組的ram,稍微不仔細規劃的話就根本不夠用。

g++在avr和stm32平台上都能用,不過估計啥都沒幹就是100k+出去了。

更極端的,類似attiny13這種1k flash、64位元組ram的小單片機,用c都夠嗆,函數調用稍微複雜一點就爆棧。用這東西想壓榨出它的大部分性能?上彙編吧。

舉個例子,elm-chan大叔搞的這個,用一片8k flash、512位元組ram的attiny85實現了播放sd卡上的wave音頻文件,最終的二進位代碼不到7k。

Simple SD Audio Player with an 8-pin IC

ps. 以後的單片機flash和ram都越來越大了,是不是可以開心地用c++了?

那還不如走得再遠一點,直接在上面跑lua或者micropython的解釋器,更方便。比如NodeMCU等項目。也許這才是以後的發展方向。


C++ 兼容 C 是指的 C++98 兼容C89。前者是1998年的標準,後者是1989年標準。

從 1999 年開始的 C99 就已經與C++不兼容了。後面的2010年左右兩者都各自製定了標準,C跟C++語法的區別此時就已經很大了。C++已不再兼容C。

你 2017 年編程不可能還用 30 年前的 C89 標準。哪怕你用 20 年前的 C99 標準,C++ 跟 C 也早就已經分道揚鑣,兩者已經是完全不同的語言。題主的問題本身就是錯的。

即便不考慮標準已經分離的問題,ABI也是C++的一個問題。科普來說就是不同C++編譯器編譯出來的庫不能混用,而C就沒這個問題。


雖然說C的功能C++全都有,問題是你也得反過來看到:移植一個c++編譯器到一個平台上的事情比移植一個C編譯器要多的多,廠商的成本也是成本啊,,所以免不了廠商就移植個C編譯器就完事了。。就算C++能替代C,在那些不提供C++編譯器的平台開發者還不是望而興嘆。


C++功能是比C多,但也複雜得多.

所以當用C就能輕鬆解決問題時,為什麼還要去碰C++呢?裝逼么?

所以我們會看到,大到Linux內核,小到SQLite資料庫, 以及我們常用的伺服器套件Apache/Nginx/Memcached/Redis/PostgreSQL, 以及網路庫libevent/libuv/libswoole等和各種系統庫如libssl/libpcre/libz等, 圖形庫GTK+,TK,多媒體方面的FFmpeg,ImageMagick等, 還有編程語言Perl,Python,PHP,Ruby,Lua,TCL等,都是C寫的. MySQL最初也是用C寫的,比如MyISAM引擎就是C寫的. GCC在2010年之前也是用C寫的,2012年才正式遷移到C++.

C性能不比C++差,而且比C++簡單.

而Java,Go,Rust等,雖然性能不如C++,但是也比C++簡單不少.

況且,別忘了,還有各種靈活易用的腳本語言.

所以C++就很尷尬了,低不成高不就,想一統天下,完全不可能.

至於嵌入式開發,libstdc++這個C++依賴庫將近800KB,嵌入式設備如STM32的KB級別的內存和快閃記憶體根本吃不消.


C語言不能被取代嗎?可以,主流操作系統使用另一種語言作為ABI即可。

JavaScript不能被取代嗎?可以,主流瀏覽器支持另一種更好的語言即可。


不是在所有情況下,過度追求執行效率而忽視開發效率都是對的。追求運行效率你直接寫彙編得了 哦不,寫彙編也不夠,你應該直接在硬體上跑,要os幹嘛?整個機器上就你一個程序,運行效率那才是高。

c的可讀性高?也不知道濫用宏的陋習是從哪兒傳出來的。

都說c++字元串處理弱,那拿來跟c比比?c語言用string.h和char[]寫出來的代碼有可讀性?不自己造輪子的話,幾行的代碼能寫成十幾行,這樣能看?

你說c能用struct來玩oo,這我不反對,但是來跟c++比一比?幾行代碼被你寫成十幾行還摻雜一大堆看不懂的宏定義。這你跟我說可讀性高?

有些人堅持使用原生dom批判jq,但是人家也同時用原生的dom把jq的所有功能都實現了一遍。那麼那些貶低c++的人,你有種也用c語言實現一遍c++所有的特性啊?

可讀性高,哪裡高呢?寫玩具程序高嗎?


這就是個挑事的問題。

C 和 C++應用領域完全不同,你都可以當兩種語言來用。

誰用C做複雜界面誰傻, 誰用C++做嵌入式誰蠢。


愛因斯坦再牛逼,也取代不了牛頓,即使現在的衛星都是用相對論修正的。


看C代碼我大概能預想到機器碼和內存布局,C++我水平不行,做不到。


C++無法取代C語言。

都這麼多年了,能取代早就取代了。

Linux內核還是用C語言寫的,至少Linus有生之年不太可能讓C++取代C來開發Linux。

說C編譯器是用C++寫的同志們,其實沒說他們每天調用的內核都是C寫的,他們每天都用的Git,也是C寫的。

如果僅僅從技術角度來說,C和C++,誰都可以取代誰。但是從實際情況來說,誰也取代不了誰,因為它們有各自的優勢和劣勢,並不完全相同。


垃圾c++,還替代c,過去的十年,是過度設計的十年,c++變的越來越不倫不類,總是在讓自己更"現代",卻離實用性越來越遠,和很多失敗的產品一樣,越複雜,越難以使用,最後越沒人用,c++就好好的用用類封裝,類繼承,虛函數就足以,寫寫界面控制項,抽象下複雜應用才是正道,成天想著替換c,那是不可能


這種語言當然可以有,但是首先得有人用,其次用的人得忍得住只用一小部分功能。


僅僅就操作系統這種c語言特長的領域而言,我的觀點是:完全替代c的難點在於人才斷代。

「c++最佳實踐多,但大家不知道怎麼做是最好的」,所以大家普遍保守,寧可c with classes。而c語言的最佳實踐不多,很多時候各種將就,反而適合項目做大。

如果用c++取代c來寫操作系統,意味著需要一批經驗極為豐富的高手,能用新時代的方法論完全替代40年來c語言積累的那一套經驗,而且還能保證設計不出大錯,能適應未來的伸縮性要求。有沒有人能保證自己寫一個c++類層次的架構,其繼承鏈上各個元素的位置在未來永不過時?

我知道c++引入了很多殺手級特性,如raii生命期管理,類型安全等等。但是試想:

如果必須要用無條件跳轉如setjmp,如何避免把raii搞掛?異常控制流呢?

如果生命期管理的複雜度超過了智能指針的語義,要不要手工new/delete?

從類型安全形度考慮,如何設計struct sock,struct file,各種vfs的繼承層次,避免傳統的void指針亂飛?萬一想給某個handle增設pollable功能,要不要用虛擬多繼承?

在這些問題要設計清楚,不知道有沒有大牛能牽頭搞出來新的os項目?


題主來給每個平台都設計一個完整的c++編譯器試試?

c的編譯器難度比c++低多了。


C library 小,C++ library 太多,很多時候用不著啊,有的新系統或者 device 剛設計出來的時候,memory 很小,只能支持 C ...


推薦閱讀:

如何看待C++前置聲明?
C++中改變了const變數的值,但輸出卻沒有改變,而內存中數據的確變了,這是怎麼回事?
如何才能自學編程並學好編程?
系統調用真正的效率瓶頸在哪裡?
C語言中,scanf("%d", &a),在設計這個語法結構時為什麼要有地址符&,沒有行不行?

TAG:編程語言 | 編程 | C編程語言 | C | 編程語言比較 |