C宏——智者的利刃,愚者的惡夢!html
在《C宏——智者的利刃,愚者的惡夢! 》一文中,提到了一種使用宏的方式 —— 「例1、用C宏,書寫代碼更簡潔」。
《C宏——智者的利刃,愚者的惡夢! 》: http://www.vckbase.com/document/viewdoc/?id=1454
《C宏——智者的利刃,愚者的惡夢! 》: http://blog.vckbase.com/smileonce/archive/2005/03/27/4081.html
本文章分別給出C++和C中不使用宏的實現方式。linux
首先,書寫代碼更簡潔是不是優勢?
有興趣的讀者請看看《設計Qt風格的C++API》一文中「便利陷阱」 (The Convenience Trap) 一節。
中文: http://blog.csdn.net/TopLanguage/archive/2008/02/21/2111467.aspx
英文: http://doc.trolltech.com/qq/qq13-apis.html程序員
【永遠記住代碼一次寫就,以後須要不斷的閱讀並理解。】
【Keep in mind that code is written more than once but has to be understood over and over again.】api
若是真要達到笑笑文中——【mbuf的屬性,徹底能夠壓扁到一個平面上去看】——這個目的,除了宏,也是有其餘方法的。函數
在這裏說明一下,笑笑在文中並無給出struct mbuf的完整定義。
我沒有linux,Cygwin也刪掉了,安裝挺麻煩的……
順藤摸瓜的下載了一部分文件:
http://opengrok.creo.hu/dragonfly/xref/src/sys/sys/mbuf.h
http://opengrok.creo.hu/dragonfly/xref/src/sys/sys/param.h
http://opengrok.creo.hu/dragonfly/xref/src/sys/net/netisr.h
http://opengrok.creo.hu/dragonfly/xref/src/sys/net/netmsg.h
http://opengrok.creo.hu/dragonfly/xref/src/sys/sys/thread.h
http://opengrok.creo.hu/dragonfly/xref/src/sys/sys/msgport.h
企圖拼出一個完整的struct mbuf定義,但實在太麻煩,這裏就放棄了 ……學習
因此只用一個簡單的例子來講明如何不使用宏來達到這一目的。
固然,也會說明若是結構體更復雜該如何擴展。測試
const怎麼辦?
(對const的考慮,C++程序員老是比C程序員要多一點,不是嗎?)優化
對更復雜的結構體,該方法的擴展是很容易的事情:在構造函數的成員初始化列表裏寫就是了。spa
對const, 轉型的時候,注意使用合適的指針類型就能夠了。.net
想更復雜的結構體擴展:
若是對上面的方案不理解,甚至對mbuf都不理解,最好仍是老老實實的使用全名。
永遠記得,代碼讀的次數比寫的次數多!
上面的方案,是利用了一個特性,叫「匿名聯合」還別的什麼東東。
含義大概是這樣:
對宏的方案(也就是mbuf.h中提供的)的改進:
物理老師歷來都是這麼寫: F = M*A;
沒見任何一個物理老師會這麼寫: F = multiply(M,A);
若是是,請馬上和同窗打賭說他是程序員,並且頗有多是C程序員。
hp_int i1,i2,i3;
// ...
數學老師也老是這麼寫: hp_int icpp = i1 + i2 * i3;
不會有數學老師這麼寫:
hp_int ic;
hp_assign(&i2,&ic);
hp_multiply(&i3,&ic);
hp_plus(&i1,&ic);
或者這麼寫:
hp_plus(&i1,hp_multiply(&i3,hp_assgin(&i2,&ic) ) );
(hp —— 高精度, 對矩陣也是一樣)
C程序員說,不知道 string s = s1 + s2 + s3;背後作了什麼。
C++程序員說,由庫決定。
C程序員說,我對庫中那些精巧的技術不感興趣(不熟悉,不肯意學)。
C++程序員說,就對宏技術感興趣?
C程序員說,宏效率高。
C++程序員說, 若是 string s = s1 + s2 + s3;能夠實現得比 strcat(strcat(strcat(....) 效率更高,你信不信?
C++ 程序員再說,若是能夠天然的寫出hp_int icpp = i1 + i2 * i3;有正確的運算優先級,效率與 hp_plus(&i1,hp_multiply(&i3,hp_assgin(&i2,&ic) ) );等同,你還願意用後者?
C程序員說,那些實現都是心智包袱,我不喜歡。
C++程序員說,宏算不算心智包袱?你怎麼就喜歡了?
總之,這只是一種不肯學習的心態,一種手拿錘子見什麼都是釘子的心態。 Linus年紀也不算大……才40歲…… 哎……