Delphi 编译器、编译指令、条件编译指令(预编译指令)
大部分情况下Delphi不需要干涉 Object Pascal 编译器的运行,但是有时也需要对编译器进行必要的设置。
1、编译器设置对话框
编译器的编译指令是用于指定编译器对项目编译过程的动作和行为。可以通过[Project]->[Options]->[Complier]选项页进行设置,
绝大部分的编译环境都可以通过这一对话框进行调整,他包含了对代码、语法、调试信息等的设置。
1.1、代码设置(Code Generation) 代码生成
- Optimization: 代码优化开关
- Aligned record fields: 字对齐数据。//这个编译指令能够在变量和类型化常量的字节对齐和字对齐之间进行切换,其作用是全局的。
- Stack frames: Windows 堆栈帧。//其作用域是局部的,他使编译器成为远端过程和函数生成特定的开头和结尾代码。这个指令用于Windows 3.0的实模式,对所有Delphi应用程序他应该是关闭的。
- Pentium-safe FDIV: Pentium安全FDIV检查。//此指令能够在Pentium处理器中指定编译器是否创建能够检测和使用有缺陷的浮点除法指令的代码。
1.2、运行期错误(Runtime Errors)
- Range Checking: 范围检查。//这个指令的作用范围是局部的,用于控制范围检验代码的生成。
- I/O Checking: I/O检查。//这个指令的作用域为局部,用来生成对一个文件的输入和输出过程和调用结果进行检查的代码。一般应该使其功能打开。
- Overflos Checking: 溢出检查。//其作用是生成对算术溢出检查的代码。
1.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兼容。
1.4.调试(Debugging)
- Debug Information: 调试信息开关。用于设置是否把调试信息写入已编译的单元文件(.dcu)。
- Local Symbols: 局部符号开关。允许或禁止局部符号信息的创建。
- Reference Info/Definitions Only: 符号信息开关。用于允许或禁止由Delohi的对象浏览器使用的符号引用信息的生成。
- Assertions: 用于控制局部代码的属性。
- Use Debug DCUs: 使用或禁止VCL的DCU文件调试。
1.5.信息(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}
- 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 , 用于指定编译时包括的文件。
3、使用条件编译指令
条件编译指令是非常重要的编译指令,他控制着在不同条件下(例如,不同的操作系统)产生不同的代码。条件编译指令是包含在注释括号之内的,如下表所示。
$DEFINE //用于定义一个条件符号,一旦定义,条件符号就为真 $ELSE //与$IFDEF配合使用,如果$IFDEF条件为假,则只对源文件$ELSE后一小部分进行编译 $ENDIF //结束一个以$IF开始的条件段 $IFDEF //对条件符号进行判断,为真则编译源文件 $IFNDEF //对条件符号进行判断,为假则编译源文件 $IFOPT //根据编译开关状态,对源文件编译 $UNDEF //撤消以前的条件符号定义
示例1:通过开关的状态来控制编译:
{IFOPT R+} ShowMessage('使用范围检查编译'); // Compiled with range-checking {$ENDIF}
示例2:通过定义条件符号来控制编译:
{$Define Test} …… {$ifdef Test} ShowMessage('yes'); {$else} ShowMessage('no'); {$endif}
编译结果显示'yes',但如果省去{$Define s}则显示'no'。
4、预定义的关键条件符号
VERxx //编译器版本,XX表示版本,例如:Delphi 7.0 的编译器版本为150 D6-->140 、 D8-->160 WIN32 //是否WIN32的运行环境(Windows 95.98/NT/2000) CPU386 //是否Intel386以上的处理器 CONSOLE //是否控制台程序 LINUX //是否LINUX程序
示例:
implementation //用到文件 Test.inc {$I Test.inc} 或 {$DEFINE TaoRoy} // 定义行 {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FCaption := '默认值'; {$IFDEF TaoRoy} FCaption := '滔 Roy'; {$ENDIF} {$IFDEF Delphi} FCaption := 'Delphi7'; {$ENDIF} end; procedure TForm1.Button1Click(Sender: TObject); begin Caption := FCaption; end; end.
文件Test.inc内容
{$DEFINE TaoRoy} {..$DEFINE Delphi}
创建时间:2021.06.11 更新时间: