今年7月初,我作為課程設計的一名負責人,領導了乙個連我在內4人的開發團隊,開發了乙個簡易的「航班訂票系統」。我定義了所需的資料結構,包括這樣乙個struct:
typedef
struct _passenger
passenger, *ppassenger;
這之後每每要新建結點的時候,都得這麼寫:
ppassenger p = (ppassenger)malloc( sizeof( passenger ) );
這一長串的**使我厭煩,我便靈機一動,借用了c++之中operator new的形式,在我的標頭檔案中寫下了如下的乙個巨集:
#define new( type, count ) (type *)malloc( sizeof( type ) * count )
於是,我新建結點的**便成了:
ppassenger p = new( passenger, 1 );
足足少用了20個字元,我極為得意,自認為這是我十年來寫下的最有創意的**之一。
也許有的朋友不以為意,認為這算不了什麼。那麼請聽我算上一筆帳吧:假如我是乙個程式設計師,打字速度是1ch/s(當然慢得過分了,好在是假設),而我的身價奇高,掙錢速度是1rmb/s。以此計算,如果我在我的程式中需要寫10行新建結點的**,那麼這個巨集將為我節省20 * 10 - 75 = 125 (s)的時間(注:所謂75s,為加上new巨集中換行符之後的回車符之故)。換算**民幣,就是125元。
正是以上的這件小事,成為了我這《隨想》的緣起。
c++之父bjarne stroustrup曾經說過,絕不應該去使用巨集,除非你不得不這樣做。是的,自c誕生以來,巨集便承載了太多的大是與大非——很多精巧的設計來自於令人拍案叫絕的巨集,比如微軟mfc類庫中的訊息對映;很多難以察覺的錯誤亦是來自於斯,比如這個老掉牙的例子:
#define macro( a, b ) a * b
int x = macro( 2, 3 ); // x == 2 * 3 == 6
int y = macro( 1 + 1, 3 ); // y == 1 + 1 * 3 == 4
c++之中倒是為巨集設計了替代品:const常量、inline函式與模板。比如以下的巨集:
#define null 0
在c++中就可以用以下的**代替:
const
int null = 0;
另外,還有巨集函式:
#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )
也可以由inline模板函式代替:
template
< typename t > inline max( const t& a, const t& b )
如此說來,巨集倒大有被取代之勢了。
不過,巨集所能給我帶來的那125元的收益,卻是const、inline和template不能取代的。
Julia 元程式設計 巨集
元程式設計 鼻祖是lisp 一直在語法上和書寫上特立獨行,其功能也和一般的函式不一樣,與從不同。這個你需要去體會。比如反射。有人喜歡 用程式生成程式 等描述。比如,沒有事先定義乙個類或函式,但是可以根據客戶輸入的資訊,動態生成相應的類或函式。這個有點象c 的 模版 比如,你輸入引數input nam...
巨集定義與巨集替換
一.c c 語言中使用巨集的主要目的主要有 3 個 1.提高 的可讀性 把用到的常量定義成有意義的名字 2.無需函式呼叫,執行效率高 對於一些簡單的操作,無需呼叫函式,雖然程式設計是強調模組化,但是函式呼叫時,需要保護現場和恢復現場。這些都需要耗時。對於複雜的操作來講,這些耗時可以不計,但是對於簡單...
巨集定義與巨集替換
一.c c 語言中使用巨集的主要目的主要有 3 個 1.提高 的可讀性 把用到的常量定義成有意義的名字 2.無需函式呼叫,執行效率高 對於一些簡單的操作,無需呼叫函式,雖然程式設計是強調模組化,但是函式呼叫時,需要保護現場和恢復現場。這些都需要耗時。對於複雜的操作來講,這些耗時可以不計,但是對於簡單...