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}之前,是编译与忽略源代码的界线。