標籤:

如何看待CC++使用大量的宏定義函數?


這不是c++,這是c的玩法。

但是,c自帶offsetof宏,何必自己寫?

foreach那個,c++11有ranged-for

for(auto item : list)
...

但這需要那個list類,有規範的迭代器介面,begin、end介面。

題圖裡的,是用struct數據結構+函數實現,那是C的寫法。c局限於語法特性,玩不了那麼靈活的用法。

至於最後兩個遍歷用的宏,就是縮短代碼咯。c沒有lambda函數,否則還能寫個foreach(list, functor)的方式來遍歷,但沒lambda的情況下,為了遍歷還得定義個函數做functor,肯定沒有用宏來的簡便快捷。

但宏有三個缺點,一個是可讀性差,一個是難調試,一個是全局命名域。

第一個問題,沒有嵌套宏,而且命名相近如題圖那樣,還好一點。

第二個問題近乎無解,宏內部的代碼越多,越難調試,因為無法精確的單步運行,除非在反彙編狀態下以指令為單位進行。

第三個么……只能盡量把宏定義在.c文件而不是.h文件中,然而這種公共數據結構,只能放.h里污染全局命名域了。

mb的之前編輯好的代碼,再次進入編輯就把代碼框和換行全給我吞了,逼乎這頁面真是越做越爛,新版比舊版還爛,看來還得繼續噴下去繼續提bug,別想我給問題報告單 - 知乎專欄


哇,題外話~這是從Linux系統的代碼里衍生出來的鏈表代碼吧,很經典的哦。

其實有時候宏是很管用的,比如很多函數的某一部分(例如開始和結尾)重複,就可以用宏處理,這樣可以少寫很多代碼,MFC當年就這麼搞的。

不過這樣的帶有大量宏(尤其是宏套宏)的代碼很難讀,能不用還是不用吧。因為代碼首先是給人讀的……


這個Linux內核很多


垃圾C因為缺少足夠的抽象能力,不得不用宏來複制粘貼代碼,C艹的抽象能力足夠強大,大部分情況下不需要像C那樣到處用宏


C艹不到必不得已別用宏

宏的功能絕大部分都有替代品


宏的作用主要是:

條件編譯

代碼生成

c++模板可以部分取代第二條,不能取代第一條。另外動態元編程需要添加一些元數據時,不一定能用TMP搞定,這時候只能搞宏。


C++而言 宏缺乏類型檢查 沒有作用域 ... 所以...然而平時的代碼里還是漫天的宏


這不就有了inline(內聯函數)


我怎麼覺得題目的斜杠畫反了


如果你寫了一份驅動代碼,你想讓它既能在MTK平台上用,又能在高通平台上用;既能在AndroidM上運行還能在N上運行。那麼宏是最好的選擇。

一般來說,現在不太會有人用c開發應用程序,因為開發效率低。c的主要用處還是修補系統內核以及編寫驅動。這些都相對穩定並且小規模化。

那些噴子,不明白就瞎噴,說什麼C缺乏想像力,不得不使用宏來複制粘貼代碼?!這麼說吧,有指針就能使用任何範式,包括所謂的面向對象,面向切面。

如果按你們的那種搞法,如何讓底層代碼有跨平台的能力?要知道底層代碼是直接跑在硬體上的,而語言的抽象卻是建立在軟體基礎上的。如果是這樣那乾脆拋棄c好了,開發效率是上去了,那內核運行效率怎麼辦?

好好想想吧。先想明白,為啥宏函數大都加上do while 0,它的意義在哪?


推薦閱讀:

關於自己的知識庫的困惑?
對於一個新手來說,在使用Visual Studio新建項目時,win32控制台應用程序和win32項目、空項目、MFC應用程序有哪些區別?

TAG:程序員 | C |