Delphi快速高小的編譯器主要來自Object PASCAL的嚴謹,使用Delphi隨時都在與編譯器交流,大部分情況下不需要幹涉編譯器的運行,但是有時也需要對編譯器進行必要的設定。
**********************************************************************************************
A.1 使用編譯設定對話方塊
編譯器的編譯指令是用於指定編譯器對項目編譯過程的動作和行為。可以通過[Project]->[Options]->[Complier]選項頁進行設定,絕大部分的編譯環境都可以通過這一對話方塊進行調整,他包含了對代碼、文法、調試資訊等的設定。
1.代碼設定(Code Generation)
Optimization: 代碼最佳化開關
Aligned record fields: 字對齊資料。這個編譯指令能夠在變數和類型化常量的位元組對齊和字對齊之間進行切換,其作用是全域的。
Stack frames: Windows 堆疊框架。其範圍是局部的,他使編譯器成為遠端過程和函數產生特定的開頭和結尾代碼。這個指令用於Windows 3.0的實模式,對所有Delphi應用程式他應該是關閉的。
Pentium-safe FDIV: Pentium安全FDIV檢查。此指令能夠在Pentium處理器中指定編譯器是否建立能夠檢測和使用有缺陷的浮點除法指令的代碼。
2.運行期錯誤(Runtime Errors)
Range Checking: 範圍檢查。這個指令的作用範圍是局部的,用於控制範圍檢驗代碼的產生。
I/O Checking: I/O檢查。這個指令的範圍為局部,用來產生對一個檔案的輸入和輸出過程和調用結果進行檢查的代碼。一般應該使其功能開啟。
Overflos Checking: 溢出檢查。其作用是產生對算術溢位檢查的代碼。
3.文法設定(Syntax Optings)
Strict Var- strings: 靜態變數串開關。用來控制對以變數參數形式傳遞的串的類型檢查。
Comlete Boolean Eval: 完全布爾表達量判定。用於執行強制的完整運算式判定。完全布爾量判定,有可能導致系統崩潰,所以一般不使用他。
Extended Syntax: 擴充文法開關。他能允許或禁止Delphi的擴充文法。
Typed @ Operator: 類型化的@運算子檢查。應用於局部的變數引用上,控制@運算子返回的指標實值型別。
Open Parameters: 開放參數開關。用於控制使用String關鍵字聲明的變數參數。開放參數允許將大小不一的串變數傳遞到同一個過程或函數中,一般在彙編中會使用到。
Huge Strings: 字串類型開關。用於控制Ansistring和Shortstring類型的切換。當開啟時符合Ansistring,關閉時符合Shortstring。
Assignable Typed Constants: 可配置類型常量。用於向下與Delphi 1.0相容。
4.調試(Debugging)
Debug Information: 調試資訊開關。用於設定是否把調試資訊寫入以編譯的單元檔案(.dcu)。
Local Symbols: 局部符號開關。允許或禁止局部符號資訊的建立。
Reference Info/Definitions Only: 符號資訊開關。用於允許或禁止由Delohi的物件瀏覽器使用的符號引用資訊的產生。
Assertions: 用於控制局部代碼的屬性。
Use Debug DCUs: 使用或禁止VCL的DCU檔案調試。
5.資訊(Messages)
Show Hints: 顯示暗示。
Show Warnings: 顯示警告。
**********************************************************************************************
A.2 使用編譯指令
除了使用編譯設定對話方塊對編譯器進行設定外,還可以通過編譯指令來對編譯器進行設定。
對於局部的編譯器設定,只有使用編譯指令來完成。
對於開關編譯指令,通過在編譯指令後加入指示開關狀態的加號和減號來控制編譯器。例如:
{$B+} : 開啟完全布爾量檢查。
{$Q-} : 關閉溢出檢查。
通常,編譯指令的範圍是在編譯指令後的代碼部分,而對於全程的編譯指令應該防在單元介面部分的開頭。
編譯設定對話方塊的設定都有與之對應的編譯指令用於在代碼中對編譯器進行設定,如下表所示。
設定項 編譯指令
Optimizations {$O}
Aligned record fields {$A}
Stack frames {$W}
Pentium-safe FDIV {$U}
Range Checking {$R}
I/O Checking {$I}
Overflow Checking {$Q}
Strict Var-strings {$V}
Comlete Boolean Eval {$B}
Extended Syntax {$X}
Typed @ Operator {$T}
Open Parameters {$P}
Huge Strings {$H}
Assertions typed constants {$J}
Debug information {$D}
Local sysnbols {$L}
在這些編譯指令以外還有一些非常有用的編譯指令。
$R Filename : 這個編譯指令是最為常用的編譯指令,他是資源檔編譯指令,用於指定串連到執行檔案和庫的資源檔,例如在工程檔案(.dpr)中會有{$R *.RES}的編譯指令,表明把尾碼為 .RES的與工程檔案同名的資源檔串連入執行檔案,也可以指定一個資源檔,資源檔的使用對於編寫Windows程式來說是很重要的基礎。
$I Filename :這個編譯指令功能類似於C語言的#Include , 用於指定編譯時間包括的檔案。
**********************************************************************************************
A.3 使用條件編譯指令
條件編譯指令是非常重要的編譯指令,他控制著在不同條件下(例如,不同的作業系統)產生不同的代碼。條件編譯指令是包含在
注釋括弧之內的,如下表所示。
條件編譯指令 含義
$DEFINE 用於定義一個條件符號,一旦定義,條件符號就為真
$ELSE 與$IFDEF配合使用,如果$IFDEF條件為假,則只對源檔案$ELSE後一小部分進行編譯
$ENDIF 結束一個以$IF開始的條件段
$IFDEF 對條件符號進行判斷,為真則編譯源檔案
$IFNDEF 對條件符號進行判斷,為假則編譯源檔案
$IFOPT 根據編譯開關狀態,對源檔案編譯
$UNDEF 撤消以前的條件符號定義
這些條件編譯指令是非常有用的。例如,可以通過開關的狀態來控制編譯:
{IFOPT R+}
showmessage('Compiled with range-checking');
{$ENDIF}
也可以通過定義條件符號來控制編譯:
{$Define s}
……
{$ifdef s}
showmessage('yes');
{$else}
showmessage('no');
{$endif}
他的編譯結果是顯示'yes',但是如果省去{$Define s}則顯示'no'。
在Delphi中已經預定義了一些關鍵的條件符號,如下表所示。
條件符號 含義
VERxx 編譯器版本,XX表示版本,例如:Delphi 1.0 的編譯器版本為80、Delphi 5.0 的編譯器版本為130
WIN32 是否WIN32的運行環境(Windows 95.98/NT/2000)
CPU386 是否Intel386以上的處理器
CONSOLE 是否控制台程式
Delphi 的編譯器指令除了以上的指令外還有一些,不過最為常用的指令已經全部介紹完了。對於普通的程式,Delphi是不需要編程者去添加編譯器指令的, Delphi已經自動完成,但是要得到高品質的應用程式或者有特殊的要求的程式就必須熟悉Delphi的編譯指令。Delphi不僅有最快的編譯器而且編譯器的功能也非常強大