Delphi作为一个优秀的开发工具,这不仅是由于它开创了“构件(Component)”时代,影响深远;另一个原因是它拥有非常出色的编译器,Borland(Inprise)公司宣称Delphi具有世界上最快的编译器,如果你使用过Visual C++和Delphi你会明显体会到这一点。Delphi快速高效的编译器主要来自Object Pascal的严谨,使用Delphi随时都在和编译器交流,大部份情况下不需要我们干涉编译器的运行,但是有时也需要对编译器进行必要的设置。作为Delphi的使用者,你是否真正了解Delphi的编译环境呢?

   1. 使用编译设置对话框

     编译器的编译指令是用以指定编译器对项目的编译过程的作为。我们可以通过Project|Options|Complier选项页进行设置。绝大部分的编译环境都可以通过这一对话框进行调整,它包括了对代码、语法、调试信息等的设置。
       Optimization:代码优化开关。
Aligned record fields:字对齐数据。这个编译指令能够在变量和类型化常量的字节对齐和字对齐之间进行切换,其作用是全局的。
Stack frames:Windows堆栈帧。其作用域是局部的,它使编译器为远端过程和函数生成特特的开头和结尾代码。这个指令用于Windows 3.0的实模式,对所有Delphi应用程序它应该是关闭的。
Pentium-safe FDIV:Pentium安全FDIV检查。此指令能够在Pentium处理器中指定编译器是否创建能够检测和使用有缺陷的浮点除法指令的代码。

   运行期错误(Runtime errors)

Range checking:范围检查。这个指令的作用范围是局部的,用于控制范围检验代码的生成。
I/O checking:I/O检查。这个指令的作用域为局部,用来生成对一个文件的输入和输出过程和调用结果进行检查的代码。一般应该使其功能打开。
Overflow checking:溢出检查。其作用是生成对算术溢出检查的代码。

   语法设置(Syntax options)

Strict var-strings:静态变量-串开关。用来控制对以变量参数形式传递的串的类型检查。
Complete boolean eval:完全布尔量判定。用于执行强制的完整表达式判定。完全布尔量判定,有可能导致系统崩溃,所以一般不使用它。
Extended syntax:扩展语法开关。它能允许或禁止Delphi的扩展语法。
Typed @ operator:类型化的@运算符检查。应用于局部的变量引用上,控制@运算符返回的指针值类型。
Open parameters:开放参数开关。用于控制使用string关键字声明的变量参数。开放参数允许将大小不一的串变量传递到同一过程或函数中,一般在汇编中会使用到。

   Huge strings:字符串类型开关。用于控制Ansistring和Shortstring类型的切换,当打开时符合Ansistring,关闭时符合Shortstring。
Assignable typed constants:可分配类型常量。用于向下与Delphi 1.0兼容。

   调试(Debugging)

Debug information:调试信息开关。用于设置是否把调试信息写入以编译的单元文件(.dcu)。
Local symbols:局部符号开关。允许或禁止局部符号信息的创建。
Reference info/Definitions only:符号信息开关。用于允许或禁止由Delphi的对象浏览器使用的符号引用信息的生成。
Assertions:用于控制局部代码的属性。
Use Debug DCUs:使用或禁止VCL的DCU文件调试。

   信息(Messages)

Show Hints:显示暗示。
Show Warnings:显示警告。

   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}

Complete boolean eval

{$B}

Extended syntax

{$X}

Typed @ operator

{$T}

Open parameters

{$P}

Huge strings

{$H}

Assignable typed constants

{$J}

Debug information

{$D}

Local symbols

{$L}

     在这些编译指令以外还有一些非常有用的编译指令。

$R Filename

  这个编译指令是最为常用的编译指令,它是资源文件编译指令,用于指定连接到执行文件和库的资源文件。例如在工程文件(.dpr)中会有{$R *.RES}的编译指令,表明把后缀为.RES的与工程文件同名的资源文件连接入执行文件,你也可以指定一个资源文件,资源文件的使用对于编写Windows程序来说是很重要的基础。

$I Filename

  这个编译指令功能类似于C语言的#Include,用于指定编译时包括的文件。

     3. 使用条件编译指令

     条件编译语句是非常重要的编译指令,它控制着在不同条件下(例如:不同的操作系统)产生不同的代码。条件编译指令是包含在注释括号之内的,它们是:
 

条件编译指令

含义

$DEFINE

用于定义一个条件符号,一旦定义,条件符号就为真

$ELSE

与 $IFDEF 配合使用,如果 $IFDEF 条件为假,则只对源文件一部分进行编译

$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中已经预定义了一些关键的条件符号:

条件符号

含义

VER××

编译器版本,××表示版本,例如 Delphi 1.0 的编译器版本为 80 、 Delphi 5.0 的编译器版本为 130

WIN32

是否是 WIN32 的运行环境( 95/98/NT/2000 )

CPU386

是否是 Intel386 以上的处理器

ONSOLE

是否是控制台程序

     Delphi的编译器指令除了以上的指令外还有一些,不过最为常用的指令已经全部介绍了。对于普通的程序,Delphi是不需要编程者去添加编译器指令的,Delphi已经自动完成,但是要得到高品质的应用程序或者有特殊要求的程序就必须熟悉Delphi的编译器指令。Delphi不仅有最快的编译器而且编译器的功能也非常强大。