编译指示是一种用来控制编译器特性的特殊语法的注释,它可以出现在普通注释允许出现的任何地方。编译指示从“{$”或“(*$”开始,紧接着是一个指示名,然后你可以添上必要的参数和注释,最后以“}”或“*)”结束。除了在程序的源代码中直接插入编译指示外,你也可以在IDE的菜单Options或命令行编译器中改变默认的指示。当你在IDE中编写程序时,你可以通过按下Ctrl+OO来让IDE在你的程序源代码开头插入当前的指示设置。编译指示分为开关编译指示、参数编译指示和条件编译指示三种。
开关编译指示用来打开或关闭某个编译器特性,你可以在指示字母后面加上“+”或“-”来控制编译器特性的开关,你还可以把多个开关指示以无空格的逗号分隔来组合成一个单独的编译指示注释,例如:{$B+}、{$R- Turn off range checking}、{$B+,R-,S-}。
开关编译指示分为全局指示和局部指示两种。全局指示影响到整个编译过程,它必须出现在程序或被编译单元的声明部分之前,通常紧跟在程序首部或单元首部之后。局部指示只对由指示开始到下一个相同的指示之前的编译过程有影响,它可以出现在源代码中的任何地方。
参数编译指示用来指定对编译过程有影响的参数,例如文件名和内存尺寸等。你可以在指示名后面加上空格和一个或多个以无空格的逗号分隔的参数,例如:{$I TYPES.INC}、{$M 16384,0,655360}。
条件编译指示通过定义和指定条件来控制是否编译某段源代码,例如:{$DEFINE Debug}、{$IFDEF Debug}、{$ENDIF}。
在Borland Pascal 7.0中,要使程序的可执行文件最小、可用功能最多并且运行速度最高,可使用开关编译指示:{$A+,B-,D-,E-,F-,G+,I-,L-,N+,O-,P+,Q-,R-,S-,T-,V-,X+,Y-}。在这种设置下,程序在编译和运行时不进行任何可选的错误检查,也不能进行调试。要使程序进行运行时错误检查,可以使用编译指示:{$I+,Q+,R+,S+}。要使程序能够调试,可以使用编译指示:{$D+,L+,Y+}。另外,为了使程序的栈尺寸和可用堆尺寸最大,还应在主程序中添加编译指示:{$M 65520, 0, 655360}。下面是一个简单的样例:
program Noname;{$A+,B-,E-,F-,G+,N+,O-,P+,T-,V-,X+}
{$I-,Q-,R-,S-}
{$D-,L-,Y-}
{$M 65520, 0, 655360}
begin
end.
在Free Pascal中,最优的编译指示是:{$I-,Q-,R-,S-,V-,X+}。要使程序进行运行时错误检查,可以使用编译指示:{$I+,Q+,R+,S+,V-,X+}。但应该注意,Free Pascal有许多编译选项是不能在源代码中以编译指示的方式设置的。你可以在IDE的菜单Options -> Mode中选择编译方式:Normal、Debug和Release。在程序最后完成时,应使用Release方式编译程序。另外,Free Pascal提供了参数编译指示{$MODE 兼容模式}用以设置编译时的兼容模式,即所用的语法,你可以根据你熟悉的语法进行选择:Default、Delphi、TP、FPC、OBJFPC和GPC。如果你只会Turbo Pascal语法,那么你应该选择TP,如果你熟悉Delphi的Object Pascal语法,那么你也可以选择Delphi。下面是一个简单的样例:
program Noname;{$I-,Q-,R-,S-,V-,X+}
{$MODE Delphi}
begin
end.
如果你不能把全部的编译指示记住,或者你使用的是编译指示不完全的较低版本的Turbo Pascal,那么你可以在IDE中按下Ctrl+OO,IDE会在当前编辑文件的开头插入默认编译指示设置,你可以在其基础上进行修改。虽然大部分的最优编译指示与默认的指示相同,但在源代码中使用编译指示显得更加安全,因为它不会受默认编译指示改变的影响。