经常看到一些程序里面用到如:
{$ifdef win16},{$ifdef win32}之类的信息,
可是这些好像并没有定义,不知道在哪里可以找到这些条件编译的定义或者是说明具体讲述win16代表什么,WIN32代表什么,VER140。。。。代表什么的?
{$IFDEF WIN32} — 这可不是批注
对于Delphi来说﹐左右大括号之间的内容是批注﹐然而「{$」
(左括号后紧接着货币符号)对于Compiler(编译器)而言并不是批注﹐
而是写给Compiler看的特别指示。
应用时机与场合
Delphi中有许许多多的Compiler Directives(编译器指令)﹐
这些编译指令对于我们的程序发展有何影响呢? 它们又能帮我们什么忙呢?
Compiler Directive 对程序开发的影响与助益, 可以从以下几个方向来讨论:
?协助除错
? 版本分类
?程序的重用与管理
? 设定统一的执行环境
协助除错
稳健熟练的程序设计师经常会在开发应用系统的过程中﹐特别加入一些除错程序或者回馈验算的程序﹐这些除错程序对于软件品质的提升有极其正面的功能。然而开发完成的正式版本中如果不需要这些额外的程序的话﹐要想在一堆程序中找出哪些是除错用的程序并加以删除或设定为批注﹐不仅累人﹐而且容易出错﹐况且日后维护时这些除错程序还用得着。此时如果能够应用像是$IFDEF的Compiler Directives ﹐就可以轻易的指示Delphi要/不要将某一段程序编进执行文件中。同时﹐Compiler本身也提供了一些错误检查的开关﹐可以预先对程序中可能的问题提醒程序设计师注意﹐同样有助于撰写正确的程序。
版本分类
除了上述的除错版本/正式版本的分类之外﹐对于像是「试用版」「普及版」「专业版」的版本分类﹐也可以经由Compiler Directive的使用﹐为最后的产品设定不同的使用权限。其它诸如「中文版」「日文版」「国际标准版」等全球版本管理方面﹐同样也可以视需要指示Delphi特别连结哪些资源档或者是采用哪些适当的程序。以上的两则例子中﹐各版本间只需共享同一份程序代码即可。
Delphi 1.0 与 Delphi 2.0有许多不同之处﹐组件资源文件(.DCR)即是其中一例﹐两者的档案格式并不兼容﹐在您读过本文之后﹐相信可以写出这样的程序﹐指示Delphi在不同的版本采用适当的资源文件以利于组件的安装。
{$IFDEF WIN32}
{$R XXX32.DCR}
{$ELSE}
{$R XXXX16.DCR}
{$EDNIF}
程序的重用与管理
经过前文的讨论后﹐相信你已经不难看出Compiler Directives在程序管理上的应用价值。对于原始程序的重用与管理﹐也是Compiler Directives 使得上力的地方. 举例来说: Pascal-Style字符串是Delphi 1.0与 Delphi 2.0之间的明显差异﹐除了原先的短字符串之外﹐
Delphi 2.0之后还多了更为方便使用的长字符串﹐同时﹐系统也额外提供了像是 Trim()这样的字符串处理函式。假如您有一个字符串处理单元必须要同时应用于Delphi 1.0 与2.0的项目时﹐编译指示器可以帮你的忙。
此外﹐透过像是{$I xxxx} 这样的 Compiler Directives﹐我们也可以适当的含入某些程序, 同样有助于切割组合我们的程序或编译设定。设定一致的执行环境项目小组的成员间﹐必须有共同的环境设定﹐我很难预料一个小组成员间彼此有不同的{$B}{$H}{$X}设定﹐最后子系统在并入主程序时会发生什么事。
此外, 当您写好一个组件或单元需要交予第三者使用时, 使用编译指示器也可以保证元件使用者与您有相同的编译环境。
使用Compiler Directives
指令语法
Compiler Directives从外表看起来与批注颇为类似, 与批注不同的是:
Compiler Directives的语法格式都是以「{$」开始, 不空格紧接一个名
称(或一个字母)表明给Compiler的特别指示, 再加上其它的开关或参数内容,
最后以右大括号作为指令的结束, 例如:
{$B+}
{$R-}
{$R MyCursor.res}
同时, 就如同Pascal的变量名称与保留字一样, Compiler Directives也是不区分大小写的。
从指令的