[转]Delphi预编译指令总结

Delphi预编译指令总结

Delphi作为一个优秀的开发工具,这不仅是由于它开创了"构件 (Component)"时代,影响深远;另一个原因是它拥有非常出色的编译器,Borland(Inprise)公司宣称Delphi具有世界上最快的 编译器,如果你使用过Visual C++和Delphi你会明显体会到这一点。Delphi快速高效的编译器主要来自Object Pascal的严谨,使用Delphi随时都在和编译器交流,大部份情况下不需要我们干涉编译器的运行,但是有时也需要对编译器进行必要的设置。对于普通 的程序,Delphi是不需要编程者去添加编译器指令的,Delphi已经自动完成,但是要得到高品质的应用程序或者有特殊的要求的程序就必须熟悉 Delphi的编译指令。使用编译选项的好处有:

1.协助除错:经常会在开发应用系统的过程中﹐特别加入一 些除错程序或者回馈验算的程序﹐这些除错程序对于软体品质的提升有极其正面的功能。然而开发完成的正式版本中如果不需要这些额外的程序的话﹐要想在一堆程 序中找出哪些是除错用的程序并加以删除或设定为注解﹐不仅累人﹐而且容易出错﹐况且日后维护时这些除错程序还用得着。此时如果能够应用像是$IFDEF的 Compiler Directives ﹐就可以轻易的指示Delphi要/不要将某一段程序编进执行档中。同时﹐Compiler本身也提供了一些错误检查的开关﹐可以预先对程序中可能的问题 提醒程序设计师注意﹐同样有助于撰写正确的程序。

2.版本分类: 对于像是「试用版」「普及版」「专业版」的版本分类﹐也可以经由Compiler Directive的使用﹐为最后的产品设定不同的使用权限。其他诸如「中文版」「日文版」「国际标准版」等全球版本管理方面﹐同样也可以视需要指示 Delphi特别连结哪些资源档或者是采用哪些适当的程序。

{$IFDEF WIN32}

{$R XXX32.DCR}

{$ELSE}

{$R XXXX16.DCR}

{$EDNIF}

3.程序的重用与管理:透过像是{$I xxxx} 这样的Compiler Directives﹐我们也可以适当的含入某些程序, 同样有助于切割组合我??们的程序或编译设定。

4.设定统一的执行环境: 单元或程序可能会在不同的机器上编译, 直接将Compiler directives加入程序, 不仅可以免去程序使用前需要特别更改IDE的麻烦, 更重要的是解决了各个单元间要求不同编译环境的歧异。

使用编译设置对话框

编译器的编译指令是用于指定编译器对项目编译过程的动作和行为。可以通过[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: 显示警告。

使用编译指令(Compiler directives)

除了使用编译设置对话框对编译器进行设置外,还可以通过编译指令来对编译器进行设置。对于局部的编译器设置,只有使用编译指令来完成。对 于开关编译指令,通过在编译指令后加入指示开关状态的加号和减号来控制编译器。例如:{$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 , 用于指定编译时包括的文件。

Delphi的注释结构:{ 括在此大括号中的内容为注释内容 ,此内容可以为多行,只要在两个大括号之间即可以,注释掉的内容一般都会以特殊的字体和颜色显示(适合所有的注释类型),很容易区分};(* 在此括号和星号之间的内容为注释内容 *);// 在此双反斜线后的内容为注释内容,此处只能为一行。注释不能被嵌套。如{{}}将不起作用,但是(*{}*)是允许的。

还有一种注释它跟普通的注释很像,但它有特殊的一点 以 "{$" 开始,以"}",此种注释称为编译指令。如{$WARNINGS OFF},它将告诉编译器不要产生错误警告信息。编译指令不是一种注释,而是一种告诉编译器如何编译的指示符。

一个编译指令实际上是一个标志符(编译器所能识别的标志符),且有其固定的语法。编译器根据不同的指令按不同的方式编译程序。你可以将一个 编译指令放在程序的任何位置(有些不应写在Unit中,对于像是{$MINSTACKSIZE}{$MAXSTACKSIZE}管理堆叠大小, 或者像是{$APPTYE}指示程序编译成图形/文字模式的Compiler directives, 只能写在.DPR中, 写在Unit中是没有效果的。)。编译指令的开始字符 " $" ,它总是出现在 "{"符号之后,$之后为编译指令的实际部分,可以是一个或多个字符(根据指令的不同而定),在指令后还可以包含一个或多个需要的参数。一个编译指令的结 束符为"}"。

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

开关编译指令地特点是它有 on 、off 两种转换状态。对于单字符版本,你可以在编译指令后添加 "+"或"-"。对于长字符版本,你可以在编译指令后添加 "on"或"off"。开关编译指令又分为全局和局部两种。全局编译指令影响全部的编译内容,它必须在放在程序和单元声明之前。局部编译指令仅影响局部的 编译内容,它的影响范围是,直至下一个最近的编译指令。它可以放在程序的任意位置。开关编译指令可以组合成一个简单的编译指令组,中间用逗号分开,但不能 有空格。例如:{$B+,R-,S-}

参数编译指令通过参数指定影响的的内容,参数可以为文件名或内存大小等。条件编译指令指定的条件如何编译特定的区域段。也就是如果满足某个条件,则按照一种方式编译,否则按另一种方式编译。所有的编译指令(除开关编译指令外)在名字和参数之间至少应有一个空格。例如:

{$B+}

{$DEFINE Debug}

{$IFDEF Debug}

{$ENDIF}

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

条件编译指令是非常重要的编译指令,他控制着在不同条件下(例如,不同的操作系统)产生不同的代码。条件编译指令是包含在

注释括号之内的,如下表所示。

条件编译指令 含义

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

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

$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中已经预定义了一些关键的条件符号,如下表所示。

条件符号 含义

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

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

CPU386 是否Intel386以上的处理器

CONSOLE 是否控制台程序

时间: 2024-10-13 02:23:02

[转]Delphi预编译指令总结的相关文章

Delphi中预编译指令

本文转自 http://www.cnblogs.com/JackSun/archive/2010/12/20/1911250.html <Delphi下深入Windows核心编程>(附录A Delphi编译指令说明) Delphi快速高小的编译器主要来自Object PASCAL的严谨,使用Delphi随时都在与编译器交流,大部分情况下不需要干涉编译器的运行,但是有 时也需要对编译器进行必要的设置. ***********************************************

在EJS脚本内使用“#include”预编译指令

此博客为9925.org的镜像,登录9925.org可以查看到最新博文. 原文出处:http://ily.so/26bMBz 预编译指令是Easton JavaScript脚本解释器对JavaScript语言拓展的重要功能之一,使用预编译指令可以引用外部的JS脚本代码,类似于HTML内的<script>标签引用外部JS脚本. #include语法解释 以“#include”指令开始,一行一个指令,指令后面加不加空格都无所谓,但是为了方便阅读通常情况下都加一个空格. 例如: //引用运行库内的A

C++ 内置宏定义 与 预编译指令

内置宏和预编译指令, 在代码调试.单元测试.跨平台代码中经常会用到.这里记录一下. 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE____TIME__ __FUNCTION__ 2.预编译指令 可以防止头文件被多次引用 可以方便解决代码跨平台编译问题 可以根据自定义变量灵活执行程序 等等,许多好处 效果可以看代码实例: test.h 1 #ifndef __TEST_H 2 #define __TEST_H 3 4 #incl

C/C++预编译指令

编译程序时,只要遇到 #error 就会跳出一个编译错误,既然是编译错误,要它干嘛呢?其目的就是保证程序是按照你所设想的那样进行编译的. 下面举个例子: 程序中往往有很多的预处理指令 #ifdef XXX ... #else #endif 当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时,就可以改成如下这样进行编译: #ifdef XXX ... #error "XXX has been defined"

c/c++中的预编译指令总结

预处理指令提供按条件跳过源文件中的节.报告错误和警告条件,以及描绘源代码的不同区域的能力.使用术语“预处理指令”只是为了与 C 和 C++ 编程语言保持一致.在 C# 中没有单独的预处理步骤:预处理指令按词法分析阶段的一部分处理. 预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见的预处理有:文件包含,条件编译.布局控制和宏替换4种. 文件包含:#include 是一种最为常见的预处理,主要是做为文件的引用组合源程序正文. 条件编译:#if,#ifndef,#ifdef,

驱动中的宏定义及预编译指令

驱动代码与平时的Win32代码有一些区别,在学习内核编程之前,简单了解一下,以后阅读代码会轻松一些. 首先是参数说明宏,一般都是空宏,例如 #define IN#define OUT 这样来看,IN和OUT都被定义成了空,注意,这儿的空即什么也没有,不同于NULL或者VOID.只要不与变量等连在一起,他们出现在代码的任何地方都没有关系 . 只是函数的一个说明,提高程序的可读性, NTSTATUS ZwQueryInformationFile( _In_  HANDLE              

C/C++中的预编译指令

工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4267) 不理解意思,遂查? C/C++中的预编译指令 程序的编译过程可以分为预处理.编译.汇编三部分,其中预处理是首先执行的过程,预处理过程扫描程序源代码,对其进行初步的转换,产生新的源代码提供给编译器.预处理过程读入源代码之后,会检查代码里包含的预处理指令,完成诸如包含其他源文件.定义宏.根据条

iOS中的预编译指令的初步探究

看到非常好的两篇技术文,转来方便自己查看. 转自:http://www.cnblogs.com/daiweilai/p/4234336.html 开篇 我们人类创造东西的时候有个词叫做”仿生学“!人类创造什么东西都会模仿自己来创造,所以上帝没有长成树的样子而和人长得一样,科幻片里面外星人也像人一样有眼睛有鼻子……但是人类自己创造的东西如果太像自己,自己又会吓尿(恐怖谷效应),人类真是奇葩:奇葩的我们在20世纪创造了改变世界的东西——计算机(电脑),不用怀疑,这货当然也是仿生学!这货哪里长得像人了

深入理解C语言的预编译指令之 include

写过C语言的朋友都熟悉#include,在打印"hello world"这样一条语句也用上这条指令.但是,说熟悉它,只是表面熟悉,更多感觉是既熟悉又抽象陌生,结果也就只是不知道为什么的背诵了.抽象.熟悉而陌生,使得#include成为"最熟悉的陌生人". 试着从另外的角度来深入理解它. 1:首先,它是一条预编译指令 也就是在编译之前就做了的,那么做了什么呢?动态包含. 2:其次,来理解何为"动态包含"? 一开始: 效果: 现在,先创建一个头文件: