Delphi快速高效的編譯器主要來自Object PASCAL的嚴謹,使用Delphi隨時都在與編譯器交流,大部分狀況下不須要干涉編譯器的運行,可是有時也須要對編譯器進行必要的設置。c++
**********************************************************************************************編程
A.1 使用編譯設置對話框瀏覽器
編譯器的編譯指令是用於指定編譯器對項目編譯過程的動做和行爲。能夠經過[Project]->[Options]->[Complier]選項頁進行設置,絕大部分的編譯環境均可以經過這一對話框進行調整,他包含了對代碼、語法、調試信息等的設置。安全
1.代碼設置(Code Generation)ide
Optimization: 代碼優化開關函數
Aligned record fields: 字對齊數據。這個編譯指令可以在變量和類型化常量的字節對齊和字對齊之間進行切換,其做用是全局的。優化
Stack frames: Windows 堆棧幀。其做用域是局部的,他使編譯器成爲遠端過程和函數生成特定的開頭和結尾代碼。這個指令用於Windows 3.0的實模式,對全部Delphi應用程序他應該是關閉的。 ui
Pentium-safe FDIV: Pentium安全FDIV檢查。此指令可以在Pentium處理器中指定編譯器是否建立可以檢測和使用有缺陷的浮點除法指令的代碼。this
2.運行期錯誤(Runtime Errors)spa
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[/B]: 顯示暗示。
Show Warnings[/B]: 顯示警告。
**********************************************************************************************
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不只有最快的編譯器並且編譯器的功能也很是強大。
﹡多條件組合判斷時能夠這樣使用
{$IF DEFINED(UDP) OR DEFINED(CMA)}
function NpInitialize(): UINT; stdcall;external 'UDPServer.dll';
function NpClose(): UINT; stdcall; external 'UDPServer.dll';
{$IFEND}
{$IFDEF TCP}
function NpInitialize(): UINT; stdcall;external 'TCPServer.dll';
function NpClose(): UINT; stdcall; external 'TCPServer.dll';
{$ENDIF}
===============================================
Name
$ExternalSym Compiler Directive
Syntax
{$ExternalSym Identifier}
Scope
Local
Description
The $ExternalSym compiler directive tells C++ Builder that Identifier is an external symbol that should not be defined in the C++ header file (.hpp) it generates for the Pascal unit.
Sometimes a symbol you must define in the Pascal unit is already defined elsewhere in C++ Builder. Use the $ExternalSym compiler directive to prevent C++ Builder from writing the symbol in the .hpp file. Note that the compiler uses the unit name as a namespace name. When you use $ExternalSym, you are telling the compiler that the symbol is defined outside the namespace. Contrast this behavior with the $NoDefine directive, where the symbol is defined in the unit’s namespace.
告訴c++builder,這個identifier是一個外部符號,不能在cb爲pascal單元所建立的頭文件(.hpp)裏聲明