cyberfan's blog

正其谊不谋其利,明其道不计其功

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  15 随笔 :: 489 文章 :: 44 评论 :: 0 Trackbacks
Delphi编译指令详解(1)——总述



Delphi编译指令共有三种,开关编译指令、参数编译指令和条件编译指令。


一个编译指令实际上是一个标志符(编译器所能识别的标志符),且有其固定的语法。
编译器根据不同的指令按不同的方式编译程序。
你可以将一个编译指令放在程序的任何位置。编译指令的开始字符是" $" ,
它总是出现在 "{"符号之后,$之后为编译指令的实际部分,可以是一个或
多个字符(根据指令的不同而定),在指令后还可以包含一个或多个需要的参数。
一个编译指令的结束符为"}"。


下面分别讲述三种编译指令


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


开关编译指令又分为全局和局部两种。


全局编译指令影响全部的编译内容,它必须在放在程序和单元声明之前。


局部编译指令仅影响局部的编译内容,它的影响范围是,直至下一个最近的编译指令。
它可以放在程序的任意位置。


开关编译指令可以组合成一个简单的编译指令组,中间用逗号分开,但不能有空格。
例如:
{$B+,R-,S-}


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


条件编译指令指定的条件如何编译特定的区域段。也就是如果满足某个条件,
则按照一种方式编译,否则按另一种方式编译。


所有的编译指令(除开关编译指令外)在名字和参数之间至少应有一个空格。
例如:
{$B+}


{$STACKCHECKS ON}
{$R- Turn off range checking}
{$I TYPES.INC}
{$M 32768,4096}
{$DEFINE Debug}
{$IFDEF Debug}


{$ENDIF}


Delphi编译指令详解(2)——排列字段类型(Align fields)


Type Switch //开关编译指令
Syntax {$A+}, {$A-}, {$A1}, {$A2}, {$A4}, or {$A8}
{$ALIGN ON}, {$ALIGN OFF}, {$ALIGN 1}, {$ALIGN 2}, {$ALIGN 4}, or {$ALIGN 8}
Default {$A8}
{$ALIGN 8}
Scope Local //局部指令


说明:


指令 $A 控制Delphi中的记录类型字段和类结构型字段。


在指令 {$A1} 或 {$A-}状态下,字段是无序的,所有的记录和类结构都被积压在一起,无序排放。


在指令 {$A2} 下,记录型的字段在声明时没有packed,类型结构中的字段,按字节顺序排列。


在指令 {$A4} 下,记录型的字段在声明时没有packed,类型结构中的字段,按双字节顺序排列。


在指令 {{$A8} 或 {$A+} 下,记录型的字段在声明时没有packed,类型结构中的字段,按四字节顺序排列。


在指令 $A 下,无论变量类型,常量类型,总是以最佳存取方式排列。在 {$A8} 下,按最快的方式排列。


Delphi编译指令详解(3)——注释与编译指令的区别与联系(Comments and compiler directives)


注释的内容将被编译器忽略,除非它们是离析器函数或编译指令。


这里有几种常见的注释结构


{ 括在此大括号中的内容为注释内容 ,此内容可以为多行,只要在两个大括号之间即可以,注释掉的内容一般都会以特殊的字体和颜色显示(适合所有的注释类型),很容易区分}
(* 在此括号和星号之间的内容为注释内容 *)
// 在此双反斜线后的内容为注释内容,此处只能为一行。.


注释不能被嵌套。如{{}}将不起作用,但是(*{}*)是允许的。


还有一种注释它跟普通的注释很像,但它有特殊的一点以 "{$" 开始,以"}",此种注释称为编译指令。

{$WARNINGS OFF}


它将告诉编译器不要产生错误警告信息。


说白了 编译指令 不是一种注释,而是一种告诉编译器如何编译的指示符。


Delphi编译指令详解(4)——应用程序类型


Type Parameter //参数指令
Syntax {$APPTYPE GUI} or {$APPTYPE CONSOLE}
Default {$APPTYPE GUI}
Scope Global //局部指令


说明


$APPTYPE 编译指令决定是否产生 Win32 控制台程序(以DOS方式显示)或
图形界面程序(以窗口显示,大部分为此程序)。


在{$APPTYPE GUI}编译指令下,编译器产生 图形界面程序,这是一种普通的Delphi应用程序。


在{$APPTYPE CONSOLE}编译指令下,编译器产生一个控制台应用程序。
当一个控制台程序启动的时候,出现一个控制台窗口,通过此窗口用户可以和应用程序交互。
此时标准的输入输出命令与控制台程序自动结合。


IsConsole布尔变量在System单元中,通过它可以查看程序是否运行在控制台程序下或图形界面程序下。


$APPTYPE编译指令只能出现在程序中。他不可以出现在 库文件 单元文件 和包中。


Delphi编译指令详解(5)——声明称指令(Assert directives)


Type Switch //开关类型
Syntax {$C+} or {$C-}
{$ASSERTIONS ON} or {$ASSERTIONS OFF}
Default {$C+}
{$ASSERTIONS ON}
Scope Local //局部


说明


$C 指令决定在Delphi资源文件中能否产生声明代码。{$C+}为默认指令。


此声明通常不用在运行时中的测试版本产品中。


Delphi编译指令详解(6)——调试信息


Type Switch //开关类型
Syntax {$D+} or {$D-}
{$DEBUGINFO ON} or {$DEBUGINFO OFF}
Default {$D+}
{$DEBUGINFO ON}
Scope Global //局部指令
&nsp;

说明:


$D 指令决定能否产生调试信息。这个信息是由每个进程产生的一个成员列表,
并记录对象代码地址在资源文件中的行号。


对于单元文件,调试信息记录在和单元文件一起的单元对象代码中。
调试信息增加单元文件的大小,当编译程序编译单元文件是将增加而外的内存。
但它不影响可执行程序的大小和速度。


当一个程序或单元文件在{$D+}状态下被编译,综合调试允许你在此模块中单步运行和设置断点。


$D指令通常和 $L一起使用,他们能决定是否产生局部调试的符号信息。


Delphi编译指令详解(7)——库文件与共享对象


Type Parameter //参数编译指令
Syntax $LIBPREFIX 'string'
$LIBSUFFIX 'string'
$LIBVERSION 'string'
Defaults $LIBPREFIX 'lib' or $SOPREFIX 'bpl'
$LIBSUFFIX ' '
$LIBVERSION ' '
Scope Global //局部指令


说明:


$LIBPREFIX 指令可以覆盖 默认的 'lib' 或 'bpl'输出文件前缀。例如你可以指定
{$LIBPREFIX 'dcl'}


对于一个设计时间包,你可以使用下面的指令去所有的前缀。
{$LIBPREFIX ' '}


$LIBSUFFIX 指令添加一个指定的后缀(在扩展明之前)到输出文件名中。
例如,使用
{$LIBSUFFIX '-2.1.3'}
添加到something.pas中,将产生
something-2.1.3.dll 文件


$LIBVERSION指令添加一个二层扩展(在原扩展名之后)到输出文件名中。例如使用
{$LIBVERSION '-2.1.3'}
在something.pas中将产生
libsomething.dll.2.1.3 文件


Delphi编译指令详解(8)——定义指令


Type Conditional compilation //条件指令
Syntax {$DEFINE name}


根据一个给定的名字设计一个Delphi条件符号。这个符号需要在此模块中已经声明和验证,
或者在{$UNDEF name}中已经出现。如果 此名字已经定义则{$DEFINE name}将失效。


Delphi编译指令详解(9)——描述指令


Type Parameter //参数
Syntax {$DESCRIPTION 'text'}
Scope Global //局部


说明


$D指令插入你指定的模块文件中,当它应放在可执行文件,Dll文件,或包的前面。
一般来说指明的是名字、版本号和版权,但是你也可以指定你需要指定的内容。
例如:
{$D 'My Application version 12.5'}


字符串不能超过256个字节。此描述对于最终用户一般是看不到的。标志你的执行文件,
通过描述性文字,版本和版权信息,将对你的最终用户有意。


提示:此文本描述必须包含在引用中。


Delphi编译指令详解(10)——ELSE指令


Type Conditional compilation //条件指令
Syntax {$ELSE}


说明:


此指令位于{$IFxxx}之后,{$ENDIF} or {$IFEND}之前,是编译与忽略源代码的界线。
posted on 2005-08-12 16:00 cyberfan 阅读(310) 评论(0)  编辑 收藏 引用 所属分类: delphi
只有注册用户登录后才能发表评论。