当前位置:文档之家› Delphi7.0_预编译指令说明

Delphi7.0_预编译指令说明

Delphi7.0 预编译指令说明

Delphi快速高效的编译器主要来自Object PASCAL的严谨,使用Delphi随时都在与编译器交流,大部分情

况下不需要干涉编译器的运行,但是有时也需要对编译器进行必要的设置。

********************************************************************************************

**

A.1 使用编译设置对话框

编译器的编译指令是用于指定编译器对项目编译过程的动作和行为。可以通过[Project]->[Options]->

[Complier]选项页进行设置(快捷键:Crtl+Shift+F11),绝大部分的编译环境都可以通过这一对话框进行调

整,他包含了对代码、语法、调试信息等的设置。

1.代码设置(Code Generation)
Optimization: 是否优化代码。包括防止变量到CPU寄存器、合并分解表达式、生成中间变量等,其作用

域是局部的。
如果{$O+}或{$OPTIMIZATION ON},如下
var
I: Integer;
begin
I := 1; //不被编译,也就是说调试的时候,这行没有断点
I := 2;
end;
如果{$O-}或{$OPTIMIZATION OFF},如下
var
I: Integer;
begin
I := 1; //被编译,也就是说调试的时候,这行有断点
I := 2;
end;
缺省:{$O+}{$OPTIMIZATION ON}

Stack frames: Windows 堆栈帧。其作用域是局部的,他使编译器成为远端过程和函数生成特定的开头和

结尾代码。这个指令用于Windows 3.0的实模式,对所有Delphi应用程序他应该是关闭的,一些调试工具

需要此类信息。
如果{$W+}{$STACKFRAMES ON},强制每个过程或函数生成堆帧,查找错误时,编译器需要堆帧帮忙。
如果{$W-}{$STACKFRAMES OFF},Delphi 会只在需要时才产生堆帧。
缺省:{$W-}{$STACKFRAMES OFF}
注:谁知道 Delphi 会在什么时后才产生堆帧,老人家向大家请教了?

Pentium-safe FDIV: Pentium安全FDIV检查。此指令能够在Pentium处理器中指定编译器是否创建能够检

测和使用有缺陷的浮点除法指令的代码。
如果{$U+}{$SAFEDIVIDE ON}自动产生对 Pentium 芯片的 bug 检查代码。
如果{$U-}{$SAFEDIVIDE OFF}不产生对 Pentium 芯片的 bug 检查代码。
缺省:{$U-}{$SAFEDIVIDE OFF}
注:这个已经不再需要了。这批有 bug 的芯片,intel 公司已经基本回收掉了(老人家现在还保留一块,

值钱了!)。

2.运行期错误(Runtime Errors)
Range Checking: 范围检查。这个指令的作用范围是局部的,用于控制范围检验代码的生成。是否对

ShortString、有序类型和Array执行越界检查。打开后增加可执行文件大小、减慢速度,一般在调试阶段

使用
如果{$R+}或{$RANGECHECKS ON},如下
var
aInt: array[0..1] of Integer;
I: Integer;
begin
I := 2;
aInt[I] := 3; //运行时提示 "Range Checking error"
end;
如果{$R-}或{$RANGECHECKS OFF},如下
var
aInt: array[0..1] of Integer;
I: Inte

ger;
begin
I := 2;
aInt[I] := 3; //运行时提示 "Access violation at address ?. Read of address ?."
end; //?=内存地址
缺省:{$R-}{$RANGECHECKS OFF}

I/O Checking: I/O检查。这个指令的作用域为局部,用来生成对一个文件的输入和输出过程和调用结果

进行检查的代码。一般应该使其功能打开。
如果{$I+}或{$IOCHECKS ON},EInOutError检查,一旦发生I/O错误时,将会触发一个EInOutError的例外


如果{$I-}或{$IOCHECKS OFF}程序执行时发生过I/O操作错误(例如检测文件是否存在函数),程序设定师

必须自行检查IOResult这个公用变量的值,如果是零,表示没有错误。IOResult函数在System.pas
缺省:{$I+}{$IOCHECKS ON}

Overflos Checking: 溢出检查。其作用是生成对算术溢出检查的代码。打开后增加可执行文件大小、减

慢速度,一般在调试阶段使用
如果{$Q+}或{$OVERFLOWCHECKS ON},如下
var
B: Byte;
begin
B := 255; //运行时提示 "Integer Overflos."
Inc(B);
end;
如果{$Q-}或{$OVERFLOWCHECKS OFF},如下
var
B: Byte;
begin
B := 255; //运行时 B := 0;
Inc(B);
ShowMessage(IntToStr(B));
end;
缺省:{$Q-}{$OVERFLOWCHECKS OFF}

3.语法设置(Syntax Optings)
Strict Var- strings: 静态变量串开关。用来控制对以变量参数形式传递的串的类型检查。当ShortString作为var参数时,是否执行严格类型

检查(包括最大长度)。为向后兼容提供,对AnsiString无效
缺省:{$V+}{$VARSTRINGCHECKS ON}
注:Delphi7.0中这个编译开关已经不起作用了

Comlete Boolean Eval: 完全布尔表达量判定,用于执行强制的完整表达式判定。比如在{$B-}状态,(1 = 1) or (2 = 2)只运算(1 = 1),因

为这时已经知道整个表达式结果。完全布尔量判定,有可能导致系统崩溃,所以一般不使用他。
缺省:{$B-}{$BOOLEVAL OFF}

Extended Syntax: 扩展语法开关。他能允许或禁止Delphi的扩展语法。对于函数调用和Null结束字符串的使用规定。
缺省:{$X+}{$EXTENDEDSYNTAX ON}
注:向后兼容,已不使用。

Typed @ Operator: 类型化的@运算符检查。应用于局部的变量引用上,控制@运算符返回的指针值类型。@(等价于Addr)是否得到有类型指针

,以及指向相同类型的有类型和无类型指针是否兼容。
如果{$T+}或{$TYPEDADDRESS ON},如下
var
I1: ^Integer;
I2: ^Integer;
begin
I1 := I2; //编译通过
end;
如果{$T-}或{$TYPEDADDRESS OFF},如下
var
I1: ^Integer;
I2: ^Integer;
begin
I1 := I2; //编译不通过,提示"Incompatible types"
end;
缺省:{$T-}{$TYPEDADDRESS OFF}

Open Parameters: 开放参数开关。对于早期Delphi中代替现在的长字符串的OpenString的使用规定,用于控制使用String关键字声明的变量参

数。开放参数

允许将大小不一的串变量传递到同一个过程或函数中,一般在汇编中会使用到。
缺省:{$P+}{$OPENSTRINGS ON}
注:向后兼容,已不使用

Huge Strings: 字符串类型开关。用于控制Ansistring和Shortstring类型的切换。当打开时符合Ansistring,关闭时符合Shortstring。
如果{$H+}或{$LONGSTRINGS ON},string类型为AnsiString,长度>255。
如果{$H-}或{$LONGSTRINGS OFF},string类型为ShortString,长度<=255。
缺省:{$H+}{$LONGSTRINGS ON}

Assignable Typed Constants: 可分配类型常量,是否可以修改有类型常量的值。用于向下与Delphi 1.0兼容。
如果{$J+}或{$WRITEABLECONST ON},如下
const
I: Integer = 12;
begin
I := 14; //编译通过
end;
如果{$J-}或{$WRITEABLECONST OFF},如下
const
I: Integer = 12;
begin
I := 14; //编译不通过,提示"Left side cannot be assigned to"
end;
缺省:{$J-}{$WRITEABLECONST OFF}


4.调试(Debugging)
Debug Information: 调试信息开关。用于设置是否把调试信息写入以编译的单元文件(.dcu)。
如果{$D+}或{$DEBUGINFO ON},那么你就可以单步调试。
如果{$D-}或{$DEBUGINFO OFF},你不能单步调试。
缺省:{$D+}{$DEBUGINFO ON},其实设置{$D+}就可以了,他不会影响EXE文件的大小和执行速度,只是dcu文件增大。

Local Symbols: 局部符号开关。允许或禁止局部符号信息的创建。是否生成本地符号(变量、常数)信息供调试器使用。
如果{$L+}{$LOCALSYMBOLS ON},可以在调试状态观察和修改本地符号的值。
如果{$L-}{$LOCALSYMBOLS OFF},不能观察和修改本地符号的值。
缺省:{$L+}{$LOCALSYMBOLS ON}
注:{$D+}时有效,不影响最后生成的可执行文件的大小和运行速度。这里符号是指常量(有类型)和变量。

Reference Info/Definitions Only: 符号信息开关。用于允许或禁止由Delphi的对象浏览器使用的符号引用信息的生成。
如果{$YD}或{DEFINITIONINFO ON}, 在Explorer Code中按Crtl+Left有效,但Brower(Ctrl+Shitf+B)不能显示符号所有引用的位置。
{$Y+}或{REFERENCEINFO ON}, 在Explorer Code中按Crtl+Left有效,并且Brower(Ctrl+Shitf+B)可以显示符号所有引用的位置。
{$Y-}或{DEFINITIONINFO OFF}, 在Explorer Code中按Crtl+Left无效,并且Brower(Ctrl+Shitf+B)不能显示符号所有引用的位置。
缺省:{$YD}{DEFINITIONINFO ON}
注:{$D+}且{$L+}时有效,不影响最后生成的可执行文件的大小和运行速度。这里符号是指单元、类型、常量、变量、类、函数、过程等。

Assertions: 决定是否可以使用Assert全局方法。
如果{$C+}或{$ASSERTIONS ON}, Assert函数有效。
如果{$C-}或{$ASSERTIONS OFF},Assert函数无效。
缺省:{$C+}{$ASSERTIONS ON}

Use Debug DCUs: 使用或禁止VCL的DCU文件调试,选中了就可以调试Delphi的{Borland}\Delphi7\Source路径下的代码了。

相关主题
文本预览
相关文档 最新文档