Delphi預編譯指令總結


Delphi作為一個優秀的開發工具,這不僅是由於它開創了"構件(Component)"時代,影響深遠;另一個原因是它擁有非常出色的編譯器,Borland(Inprise)公司宣稱Delphi具有世界上最快的編譯器,如果你使用過Visual C++和Delphi你會明顯體會到這一點。Delphi快速高效的編譯器主要來自Object Pascal的嚴謹,使用Delphi隨時都在和編譯器交流,大部份情況下不需要我們干涉編譯器的運行,但是有時也需要對編譯器進行必要的設置。對於普通的程序,Delphi是不需要編程者去添加編譯器指令的,Delphi已經自動完成,但是要得到高品質的應用程序或者有特殊的要求的程序就必須熟悉Delphi的編譯指令。使用編譯選項的好處有:

1.協助除錯:經常會在開發應用系統的過程中﹐特別加入一些除錯程序或者回饋驗算的程序﹐這些除錯程序對於軟體品質的提升有極其正面的功能。然而開發完成的正式版本中如果不需要這些額外的程序的話﹐要想在一堆程序中找出哪些是除錯用的程序並加以刪除或設定為注解﹐不僅累人﹐而且容易出錯﹐況且日后維護時這些除錯程序還用得着。此時如果能夠應用像是$IFDEF的Compiler Directives ﹐就可以輕易的指示Delphi要/不要將某一段程序編進執行檔中。同時﹐Compiler本身也提供了一些錯誤檢查的開關﹐可以預先對程序中可能的問題提醒程序設計師注意﹐同樣有助於撰寫正確的程序。

2.版本分類: 對於像是「試用版」「普及版」「專業版」的版本分類﹐也可以經由Compiler Directive的使用﹐為最后的產品設定不同的使用權限。其他諸如「中文版」「日文版」「國際標准版」等全球版本管理方面﹐同樣也可以視需要指示Delphi特別連結哪些資源檔或者是采用哪些適當的程序。

{$IFDEF WIN32}

{$R XXX32.DCR}

{$ELSE}

{$R XXXX16.DCR}

{$EDNIF}

3.程序的重用與管理:透過像是{$I xxxx} 這樣的Compiler Directives﹐我們也可以適當的含入某些程序, 同樣有助於切割組合我​​們的程序或編譯設定。

4.設定統一的執行環境: 單元或程序可能會在不同的機器上編譯, 直接將Compiler directives加入程序, 不僅可以免去程序使用前需要特別更改IDE的麻煩, 更重要的是解決了各個單元間要求不同編譯環境的歧異。

使用編譯設置對話框

編譯器的編譯指令是用於指定編譯器對項目編譯過程的動作和行為。可以通過[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: 顯示警告。

使用編譯指令(Compiler directives)

除了使用編譯設置對話框對編譯器進行設置外,還可以通過編譯指令來對編譯器進行設置。對於局部的編譯器設置,只有使用編譯指令來完成。對於開關編譯指令,通過在編譯指令后加入指示開關狀態的加號和減號來控制編譯器。例如:{$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 , 用於指定編譯時包括的文件。

Delphi的注釋結構:{ 括在此大括號中的內容為注釋內容 ,此內容可以為多行,只要在兩個大括號之間即可以,注釋掉的內容一般都會以特殊的字體和顏色顯示(適合所有的注釋類型),很容易區分};(* 在此括號和星號之間的內容為注釋內容 *);// 在此雙反斜線后的內容為注釋內容,此處只能為一行。注釋不能被嵌套。如{{}}將不起作用,但是(*{}*)是允許的。

還有一種注釋它跟普通的注釋很像,但它有特殊的一點 以 "{$" 開始,以"}",此種注釋稱為編譯指令。如{$WARNINGS OFF},它將告訴編譯器不要產生錯誤警告信息。編譯指令不是一種注釋,而是一種告訴編譯器如何編譯的指示符。

一個編譯指令實際上是一個標志符(編譯器所能識別的標志符),且有其固定的語法。編譯器根據不同的指令按不同的方式編譯程序。你可以將一個編譯指令放在程序的任何位置(有些不應寫在Unit中,對於像是{$MINSTACKSIZE}{$MAXSTACKSIZE}管理堆疊大小, 或者像是{$APPTYE}指示程序編譯成圖形/文字模式的Compiler directives, 只能寫在.DPR中, 寫在Unit中是沒有效果的。)。編譯指令的開始字符 " $" ,它總是出現在 "{"符號之后,$之后為編譯指令的實際部分,可以是一個或多個字符(根據指令的不同而定),在指令后還可以包含一個或多個需要的參數。一個編譯指令的結束符為"}"。

Delphi編譯指令共有三種,開關編譯指令、參數編譯指令和條件編譯指令,下面分別講述三種編譯指令

開關編譯指令地特點是它有 on 、off 兩種轉換狀態。對於單字符版本,你可以在編譯指令后添加 "+"或"-"。對於長字符版本,你可以在編譯指令后添加 "on"或"off"。開關編譯指令又分為全局和局部兩種。全局編譯指令影響全部的編譯內容,它必須在放在程序和單元聲明之前。局部編譯指令僅影響局部的編譯內容,它的影響范圍是,直至下一個最近的編譯指令。它可以放在程序的任意位置。開關編譯指令可以組合成一個簡單的編譯指令組,中間用逗號分開,但不能有空格。例如:{$B+,R-,S-}

參數編譯指令通過參數指定影響的的內容,參數可以為文件名或內存大小等。條件編譯指令指定的條件如何編譯特定的區域段。也就是如果滿足某個條件,則按照一種方式編譯,否則按另一種方式編譯。所有的編譯指令(除開關編譯指令外)在名字和參數之間至少應有一個空格。例如:

{$B+}

{$DEFINE Debug}

{$IFDEF Debug}

{$ENDIF}

條件編譯的嵌套最多可以16層:在使用{$IFDEF}…{$ENDIF}條件編譯我們的程序時, 一個{$IFDEF}中可以再包含另一個{$IFDEF}, 但深度最多只能16層, 雖然是個限制, 但以正常的情形來說, 這應該已經足夠了。

條件編譯指令是非常重要的編譯指令,他控制着在不同條件下(例如,不同的操作系統)產生不同的代碼。條件編譯指令是包含在

注釋括號之內的,如下表所示。

條件編譯指令 含義

$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 是否控制台程序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM