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: Integer;
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}
在命令行下输入:dcc32 /? >1.txt可以把编译的开关指令弄到文本文件中,内容如下:
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
Syntax: dcc32 [options] filename [options]
语法:dcc32 选项 文件名 选项
-A= = Set unit alias
-A <单元>=<别名> 设置单元别名
-B = Build all units
编译所有单元
-CC = Console target
控制台目标
-CG = GUI target
图形用户接口目标
-O = Object directories
-O <路径> 对象目录
-D = Define conditionals
-P = look for 8.3 file names also
以8.3文件名格式查看
-E = EXE output directory
exe文件的输出目录
-Q = Quiet compile
静态编译(俺猜想估计是不乱七八糟的提示俺代码错误的编译吧。哈哈)
-F = Find error
找错?(现在俺的级别不用找错误都很多啊
-R = Resource directories
资源文件目录
-GD = Detailed map file
详细的映射?(地图)文件
-U = Unit directories
单元目录
-GP = Map file with publics
公开的地图文件
-V = Debug information in EXE
exe文件里的调试信息
-GS = Map file with segments
?
-VR = Generate remote debug (RSM)
生成远程调试
-H = Output hint messages
输出隐藏的消息
-W = Output warning messages
输出警告信息
-I = Include directories
包含目录
-Z = Output 'never build' DCPs
?不压缩的输出?
-J = Generate .obj file
生成.obj文件
-$
编译器目录
-JP = Generate C++ .obj file
生成C++格式的.obj文件
--help = Show this help screen
在屏幕上显示帮助
-K = Set image base addr
--version = Show name and version
显示名称和版本
-LU = Use package
使用包文件
-M = Make modified units
重建单元
-N = DCU output directory
DCU输出目录
上述为dcc32程序的参数,下面是编译器开关
Compiler switches: -$ (defaults are shown below)
编译器开关:-$<字母><状态>(下面显示的是默认值)
A8 Aligned record fields
The $A directive controls alignment of fields in Delphi record types and class structures.
红色部分是帮助文件里的。
好像是说指令控制器在delphi记录类型和类结构里对器的字段?
P+ Open string params
B- Full boolean Evaluation Q- Integer overflow checking
C+ Evaluate assertions at runtime R- Range checking
D+ Debug information T- Typed @ operator
G+ Use imported data referencesU- Pentium(tm)-safe divide
H+ Use long strings by default V+ Strict var-strings
I+ I/O checkingW- Generate stack frames
J- Writeable structured consts X+ Extended syntax
L+ Local debug symbols Y+ Symbol reference info
M- Runtime type info Z1 Minimum size of enum types
O+ Optimization