您的位置:首页 > 编程语言 > Delphi

Delphi预编译指令

2015-10-15 11:31 519 查看

Delphi编译指令共有三种,开关编译指令、参数编译指令和条件编译指令,下面分别讲述三种编译指令

开关编译指令

开关编译指令的特点是它有ON 、OFF两种转换状态。对于单字符版本,你可以在编译指令后添加 "+"或"-"。对于长字符版本,你可以在编译指令后添加 "ON"或"OFF"。

开关编译指令又分为全局和局部两种。全局编译指令影响全部的编译内容,它必须在放在工程或单元声明之前。局部编译指令仅影响局部的编译内容,它的影响范围是,

直至下一个最近的编译指令。它可以放在程序的任意位置。开关编译指令可以组合成一个简单的编译指令组,中间用逗号分开,但不能有空格。例如:{$B+,R-,S-}

参数编译指令

通过参数指定影响的的内容,参数可以为文件名或内存大小等。

{$INCLUDE 文件名称} 或 {$I 文件名称} 将指定文件的内容插入到当前位置

{$L 文件名称} {$LINK 文件名称} 连结目标文件

{$R filename},{$RESOURCE filename},{$R *.xxx},{$R filename.res filename.rc} 资源文件编译指令,用于指定连接到执行文件和库的资源文件

{$MINSTACKSIZE 数字} 指定堆栈的最小值

{$MAXSTACKSIZE 数字} 指定堆栈的最大值

{$M min, max} 同时指定最小和最大值

{$APPTYPE GUI} 和 {$APPTYPE CONSOLE} 只能写在工程文件里才有效。{$APPTYPE GUI} 和 {$APPTYPE CONSOLE} 分别表示图形窗口工程和控制台工程.

条件编译指令

编译指令 含义

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

$UNDEF 撤消以前的条件符号定义

$IFDEF 对条件符号进行判断,为真则编译源文件

$IFNDEF 对条件符号进行判断,为假则编译源文件

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

$ENDIF 结束一个以$IF开始的条件段

$IFOPT 根据编译开关状态,对源文件编译

按照指定的条件编译特定的代码段。也就是如果满足某个条件,则按照一种方式编译,否则按另一种方式编译。所有的编译指令(除开关编译指令外)在名字和参数之间至少应有一个空格。

这些条件编译指令是非常有用的。例如,可以通过开关的状态来控制编译:

{IFOPT R+}

showmessage('Compiled with range-checking');

{$ENDIF}

{$IFDEF MSWINDOWS}

GlobalNameSpace := TMultiReadExclusiveWriteSynchronizer.Create;

{$ENDIF}

{$IFDEF LINUX}

GlobalNameSpace := TSimpleRWSync.Create;

{$ENDIF}

条件编译的嵌套最多可以16层:在使用{$IFDEF}…{$ENDIF}条件编译我们的程序时, 一个{$IFDEF}中可以再包含另一个{$IFDEF}, 但深度最多只能16层, 虽然是个限制, 但以正常的情形来说, 这应该已经足够了。

条件语句的更多用法

1.$IFDEF 等同于 $IF DEFINED(...) : 它们的结束分别是: $ENDIF、$IFEND;例如:

{$IF DEFINED(VER200)}

ShowMessage('这是 Delphi 2009');

{$IFEND}

2.$IFNDEF 等同于 $IF NOT DEFINED(...) : 它们的结束分别是: $ENDIF、$IFEND; 例如:

{$IF NOT DEFINED(VER150)}

ShowMessage('这不是 Delphi 7');

{$IFEND}

3.使用ANDh或者OR进行组合

{$DEFINE AAA}

{$DEFINE BBB}

{$IF DEFINED(AAA) OR DEFINED(BBB)}

ShowMessage('条件标识符 AAA 和 BBB 其中一个定义了');

{$IFEND}

{$IF DEFINED(AAA) AND DEFINED(BBB)}

ShowMessage('条件标识符 AAA 和 BBB 都定义了');

{$IFEND}

条件符号 含义

VERxx 编译器版本,XX表示版本,例如:VER120 : Delphi 4,VER130 : Delphi 5,VER140 : Delphi 6,VER150 : Delphi 7,VER160 : Delphi 8,VER170 : Delphi 2005,VER180 : Delphi 2006,VER185 : Delphi 2007,VER200 : Delphi 2009

WIN32 是否WIN32的运行环境(Windows 95.98/NT/2000)

CPU386 是否Intel386以上的处理器

CONSOLE 是否控制台程序

MSWINDOWS 是否为Windows操作系统

LINUX 是否为LINUX操作系统

DEBUG 调试模式

RELEASE 发布模式

UNICODE 是否支持Unicode

UNICODESTRING 是否支持UNICODESTRING

编译设置对话框

编译器的编译指令是用于指定编译器对项目编译过程的动作和行为。可以通过[Project]->[Options]->[Complier]选项页进行设置,绝大部分的编译环境都可以通过这一对话框进行调整,他包含了对代码、语法、调试信息等的设置。

1.代码设置(Code Generation)

Optimization: 代码优化开关

Aligned record fields: 字对齐数据。这个编译指令能够在变量和类型化常量的字节对齐和字对齐之间进行切换,其作用是全局的。

Stack frames: Windows 堆栈帧。其作用域是局部的,他使编译器成为远端过程和函数生成特定的开头和结尾代码。这个指令用于Windows 3.0的实模式,对所有Delphi应用程序他应该是关闭的。

Pentium-safe FDIV: Pentium安全FDIV检查。此指令能够在Pentium处理器中指定编译器是否创建能够检测和使用有缺陷的浮点除法指令的代码。

2.运行期错误(Runtime Errors)

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: 显示暗示。

Show Warnings: 显示警告。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: