2009年2月6日 星期五

邪惡的巨集

巨集(Macro)是邪惡的。

它很好用,可以簡化我們的程式碼,節省很多Coding的時間。

但是它暗地裡在破壞我們程式碼的物件架構,在物件封裝中到處鑽孔。

所以,前兩天,我將程式碼裡頭的

#include "windowsx.h"

給拔掉。

這個標頭檔,定義了很多巨集,有些是簡化windows訊息程式碼,有些是簡化windows API。平常是很好用的啦,但是,好死不死的,我有個樹狀結構的物件,裡頭有幾個函式-- GetFirstChild, GetNextChild, ... 就跟windows API的巨集衝突到了。

好端端擺在物件中的GetFirstChild函式,被windows API的GetFirstChild巨集取代掉,所以編譯器瞬間開始混亂,看不懂我的程式碼在幹什麼,連錯誤回報也是亂報一通不知所云。

花了時間除錯,拔掉了這些個讓人偷懶的巨集。

所以這巨集真不是好東西。

裹著糖衣的毒藥。

Code Complete的作者在書裡也有說,巨集,能不用就不用,務必謹慎使用。

是啊,別偷懶了,該拔掉的就拔掉吧。

==================================================

其實今天一早,還遇見了另一個類似的問題。

我在數學函式庫裡,定義了一個靜態常數PI (就是圓周率啦),還特別放在一個Math物件中,用Math::PI這樣的語法來存取,避免這種常數定義衝突的狀況。

class Math
{
...
static const float PI;
};

不過,又來了,好死不死,Max SDK裡面也定義了一個PI,而且是直接#define,

#define PI  ((float)3.1415926535)

結果我怎麼辦? 我只能先引入自己數學函式庫的標頭檔,然後再引入Max SDK的標頭檔,順序絕對不能換,否則編譯器就會開始錯亂。