Delphi Object Pascal 編譯器的編譯指令之五({$DEFINE條件名稱})(本人會連續刊登) (2001年3月16日)
网友更新 分类:杂类 作者:erp2 推荐:erp2 阅读次数:193
(http://www.codesky.net)
--------------------------------------------------------------------------------
姓名﹕黃智
郵件﹕erp2@263.net
日期﹕2001-03-16
電話﹕13650246680
{$DEFINE條件名稱} 定義條件名稱
隨著您對Compiler Directives的瞭解與應用程度的加深, 您會發現這是一個非常實用的編譯指示。
經常, 我們會因為除錯需要﹑區別不同版本等緣故, 希望選擇性的採用或排除某一段程式, 這個時候, 我們就可以先以$DEFINE定義好一個條件名稱(Conditional name), 然後配合{$IFDEF條件名稱}…{$ELSE}…{$ENDIF}指示編譯器按指定的條件名稱之有無來選擇需要編譯的程式。以下列的程式片斷來說:
{$DEFINE _ProVersion}
…
procedure TForm1.Button1Click(Sender: TObject);
begin
{$IFDEF _Proversion}
frmPrint.ShowModal; // A
{$ELSE}
ShowMessage('很抱歉, 試用版不提供列印功能');
{$ENDIF}
end;
編譯器將會選擇編譯上述A的那列程式, 日後, 如果我們需要編譯「簡易版」的程式版本時, 只要:
? 將{$DEFINE _ProVersion}那列整個刪掉。
? 或者, 將{$DEFINE _ProVersion}改成{-$DEFINE _ProVersion}, 讓它變成普通的註解
? 或者, 在{$DEFINE _ProVersion}的下一列加上{$UNDEF _ProVersion}, 解除_ProVersion這個條件名稱的定義。
這樣, 由於_ProVersion這個條件名稱未定義的緣故, Compiler就只會選擇{$ELSE}下的那段程式, 重新編譯一次, 不需費太多力氣, 很容易的就可以製作出「簡易版」了, 省去了要同時維護兩份程式的麻煩。
使用$DEFINE時的其他注意事項如下:
? 以{$DEFINE}定義的條件名稱都是區域的。換句話說, 它的作用範圍只在當時所在的單元才有效, 即使定義在unit的interface, 由其他的unit以uses參考也沒有效, 仍然只有在目前的unit有作用。
? 此外, 它的作用範圍是從定義起, 到unit結尾或者以{$UNDEF}解除為止。
? 如果程式單元中已經用{$DEFINE}定義了一個條件名稱, 而且也沒有用{$UNDEF}解除定義, 重新{$DEFINE}一個同樣名稱並沒有作用, 換句話說, 它們是同一個.
? 假如需要一個全域的條件名稱, 您可以:主選單: Project / Options / Directories/Conditional 的 Conditionals 中填入條件名稱。
? 以下的標準條件名稱, 是Delphi 2.0已經預先預備好的, 我們可以直接引用, 同時, 它們都是全域的, 任何Unit都可以參照得到。
? VER90: Delphi Object Pascal的版本編號。90表示9.0版, 日後若出現9.5版時, 也會有VER95的定義。
? WIN32: 指出目前是在Win32(95, NT)作業環境
? CUP386: 採用386(含)以上的CPU時, 系統會提供本條件名稱。
? CONSOLE: 此符號會於應用程式是在螢幕模式下編譯時才定義。