大榕树——让我们共成长!
大榕树 myDrs.org
您的位置:大榕树 \ 编程       |  Logo语言   |  Pascal语言   |  信息学奥赛   |  高考保送    |  HTML版本
|  Pascal语言>>Pascal入门>>PascalFAQ编译指示专题         本站全文搜索: 友情提示:

PascalFAQ编译指示专题
http://www.mydrs.org  10/29/2002  大榕树



什么是编译指示?



编译指示是一种用来控制编译器特性的特殊语法的注释,它可以出现在普通注释允许出现的任何地方。编译指示从“{$”或“(*$”开始,紧接着是一个指示名,然后你可以添上必要的参数和注释,最后以“}”或“*)”结束。除了在程序的源代码中直接插入编译指示外,你也可以在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全局实模式
保护模式
Windows



$A+(默认值)
所有大于1字节的变量(不包括记录字段和数组元素)均强制从偶地址开始存放,以获得更快的访问速度。
$A-
不对齐数据,变量将简单地存放在下一可用地址。
附注
在任何情况下,每个全局变量声明部分均从偶地址开始。编译器将一直保持栈指针(SP)位于偶地址上,并在必要时分配一个不用的额外字节。
$B局部实模式
保护模式
Windows




$B+
编译器将生成完全的布尔表达式求值代码,因此即使整个表达式的结果已经可以确定,所有执行and和or运算的布尔表达式都将被完整求值。
$B-(默认值)
编译器将生成短路布尔表达式求值代码,因此在整个表达式的结果可以确定时将立即停止表达式求值。

$D全局实模式
保护模式
Windows




$D+(默认值)
编译器将为程序或单元的每个子程序生成相应的行号表,以便IDE可以调试程序和查找引发运行时错误的位置。
$D-
编译器将不生成任何调试信息。

$E全局实模式
保护模式
Windows
仿
$E+(默认值)
编译器将生成80x87数字协处理器仿真库代码,程序在没有80x87的机器上运行时可以仿真80x87,进行浮点运算。
$E-
编译器只生成更小的只在80x87存在时可用的浮点运算库,程序不能在没有80x87的机器上运行。
附注
在单元中使用$E开关没有任何效果,它只应用在程序的编译上。在$N-时将忽略$E开关。
$F局部实模式
保护模式
Windows





$F+
在$F+后实现的子程序将强制使用远调用。
$F-(默认值)
编译器将自动选择在$F-后实现的子程序的调用模式。
$G全局实模式
保护模式
Windows


2
8
6

$G+
编译器将使用80286附加指令来改进代码生成,程序不能在8088或8086处理器上运行。
$G-(默认值)
编译器只生成8086指令,程序可以在所有的8086系列的处理器上运行。
$I局部实模式
保护模式
Windows





$I+(默认值)
自动生成代码,在每次调用输入输出子程序后检查I/O返回值,当I/O返回值为非零值时终止程序并显示运行时错误讯息。
$I-
不生成检查I/O返回值的代码,你必须使用IOResult函数来检查I/O错误。
$K全局Windows


 
$L全局实模式
保护模式
Windows





$L+(默认值)
生成局部符号信息,在调试程序时可以观察、修改局部变量的值和在调用栈窗口中察看子程序。
$L-
不生成局部符号信息。
附注
在$D-时将忽略$L指示。
$N全局实模式
保护模式
Windows





$N+
编译器生成的代码将通过使用80x87数字协处理器来执行所有的实数类型计算,并可以访问四种附加的实数类型:Single、Double、Extended和Comp。
$N-(默认值)
编译器生成的代码将调用运行时库程序来以软件方式执行所有的实数类型计算。
附注
可以使用$E+指示来仿真80x87,这样就能够在没有80x87芯片的时候访问IEEE浮点类型。
$O全局实模式




$O+
代码生成器将为从一个覆盖子程序中传递字符串和集合常参到另一个覆盖子程序中的情况准备预防措施。
$O-(默认值)
不生成相应的覆盖代码。
附注
$O+指示一般与$F+指示共同使用,以满足覆盖管理器的远程调用需要。
$P全局实模式
保护模式
Windows






$P+
使用保留字string声明的变参将被视为开放字符串参数。开放字符串参数的实际参数可以是任何字符串类型的变量,在其子程序中,形式参数的最大长度属性将与实际参数相同。
$P-(默认值)
使用保留字string声明的变参将被视为正常的变参,这样可以保持与早期版本的Turbo Pascal的兼容性。
附注
不管$P指示如何设置,使用OpenString标识符声明的变参都将始终视为开放字符串参数。
$Q局部实模式
保护模式
Windows



$Q+
生成代码为某些整数运算检查溢出错误,例如:+、-、*、Abs、Sqr、Succ和Pred。如果这些运算的结果超出了可支持的范围,将终止程序并显示运行时错误讯息。
$Q-(默认值)
不检查溢出错误。
附注
$Q指示对Inc和Dec标准子程序没有影响,它们不会检查溢出错误。
$R局部实模式
保护模式
Windows



$R+
对所有的数组、字符串索引号表达式和所有的对标量、子界类型变量的赋值操作进行范围检查。如果范围检查失败,将结束程序并显示运行时错误讯息。
$R-(默认值)
不进行范围检查。
$S局部实模式
保护模式
Windows




$S+(默认值)
编译器将在每个子程序的开头生成代码检查是否有足够的栈空间用以存放局部变量和其它临时数据。当栈空间不足时,将结束程序并显示运行时错误讯息。
$S-
不进行栈溢出检查,在没有足够的栈空间时,对子程序的调用很可能会引起系统崩溃。
$T局部实模式
保护模式
Windows





$T+
@运算符的返回值类型将是类型指针,类型指针与指向不同类型的其它类型指针不相容。
$T-(默认值)
@运算符的返回值类型将是无类型指针。
$V局部实模式
保护模式
Windows






$V+(默认值)
进行严格的类型检查,要求形式参数和实际参数必须为相同的字符串类型。
$V-
实际参数可以是任何的字符串类型,即使它的最大长度与形式参数不相同。尽管$V-仍然被支持,但应该使用开放字符串参数。
$W局部Windows


 
$X全局实模式
保护模式
Windows



$X+(默认值)
可以像子程序一样调用函数,并抛弃函数的返回值,但这不能用于内置的函数(在System单元里声明的函数)。同时,通过激活用于内置的PChar类型和基于零的字符数组的特殊语法来支持空结束字符串。
$X-
屏蔽扩展语法。
$Y全局实模式
保护模式
Windows





$Y+(默认值)
生成符号索引信息,供IDE的程序浏览器使用。
$Y-
不生成符号索引信息。
附注
$Y指示只在单元中使用,它只在$D和$L同时打开时有效。TPC和Turbo不支持$Y指示。

Borland Pascal 7.0提供下面的参数编译指示:































































指示类型适用环境含义说明
$C 属性全局保护模式
Windows




 
$D 文本全局保护模式
Windows

 
$I 文件名局部实模式
保护模式
Windows



编译时在$I指示的当前位置插入另一个文本文件的内容。最多可以嵌套插入文件15层。
附注
不能在语句部分中插入文件,整个语句部分必须位于同一个源文件中。默认的文件扩展名为.pas。
$G 单元名, 单元名...局部保护模式
Windows





 
$L 文件名局部实模式
保护模式
Windows





指示编译器连接一个Intel可再定位对象文件(.obj文件)。
附注
默认的文件扩展名为.obj。
实模式
$M 栈尺寸, 堆下限, 堆上限
保护模式
$M 栈尺寸
Windows
$M 栈尺寸, 堆尺寸
全局实模式
保护模式
Windows





实模式(默认:$M 16384, 0, 655360)
指定程序的栈尺寸(1024~65520)、最小堆尺寸(0~655360)和最大堆尺寸(0~655360)。
保护模式(默认:$M 16384)
指定程序的栈尺寸(1024~65520)。
Windows(默认:$M 8192, 8192)
指定程序的栈尺寸(1024~65520)和数据段中的局部堆域尺寸(0~65520)。
$O 单元名局部实模式




 
$R 文件名局部保护模式
Windows



 
$S 段尺寸全局保护模式
Windows





 

Borland Pascal 7.0提供下面的条件编译指示:





























指示含义示例
$DEFINE 名称定义一个条件符号。{$DEFINE Debug}
{$IFNDEF Debug}
Here won't be compiled.
{$ELSE}
{$IFOPT X+}
If $X+ is specified,
here will be compiled.
{$ENDIF}
{$ENDIF}
{$UNDEF Debug}
$ELSE编译或忽略接下来的源代码。
$ENDIF结束条件编译。
$IFDEF 名称如果指定名称被定义就编译接下来的源代码。
$IFNDEF 名称如果指定名称没有被定义就编译接下来的源代码。
$IFOPT 开关如果指定开关为当前状态就编译接下来的源代码。
$UNDEF 名称取消定义一个指定名称的已定义条件符号。

Borland Pascal 7.0提供下面的预定义条件符号:


























符号含义示例
CPU86CPU属于80x86处理器系列。{$IFDEF DPMI}
HeapBlock := 65528;
HeapLimit := 16382;
{$ELSE}
Set to Protected mode please.
{$ENDIF}
{$IFNDEF VER70}
Use Turbo Pascal 7.0 please.
{$ENDIF}
CPU87存在80x87数字协处理器。
DPMI操作环境为DOS保护模式。
MSDOS操作系统为实模式MS-DOS或PC-DOS。
VER70Turbo Pascal版本号为7.0。
WINDOWS操作环境为MS-Windows。

Free Pascal也提供了大量的编译指示,但很多都用不上,这里就不给出了。


如何设置默认的编译指示?



在IDE的菜单Options -> Compiler中,你可以设置所有的开关编译指示默认值,在其中的Conditional defines编辑框中可以输入默认的条件符号,以分号分隔每个条件符号。另外,你还可以在菜单Options -> Memory sizes中设置参数编译指示$M的默认值。


默认的编译指示在编译时对所有的程序和单元都有效,因此它的作用域是全局的,当然,你可以在源代码中添加新的编译指示来覆盖默认的编译指示设置。


如何设置最优的编译指示?



在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会在当前编辑文件的开头插入默认编译指示设置,你可以在其基础上进行修改。虽然大部分的最优编译指示与默认的指示相同,但在源代码中使用编译指示显得更加安全,因为它不会受默认编译指示改变的影响。


作 者:陈世熹
共有5975位读者阅读过此文

  • 上篇文章PascalFAQ编译模式专题
  • 下篇文章第八届分区提高组初赛试题

  • 发送邮件
    保存页面 打印文章 HTML版本 发表评论

    □- 近期热门文章 □- 相关文章
    1. NOIP2006竞赛大纲 [8307]
    2. 七类高中生具有保送资格 [5911]
    3. NOI2006获奖选手名单 [4956]
    4. 关于举办NOIP2006模拟赛的通告 [4107]
    5. Turbo Pascal各语句运行速... [3595]
    6. Turbo王者归来新Delphi免费... [3182]
    7. IOI2006我国4名选手全部获得金... [2946]
    8. 关于APIO2007与IOI2007... [2764]
    9. noip倒计时 by 枯叶蝴蝶 [2684]
    10. 朱泽园:思想上的金牌更重要 [2169]
    PascalFAQ之特殊技术
    PascalFAQ之基本技巧
    PascalFAQ之数据类型
    PascalFAQ之语法专题
    PascalFAQ之输入输出
    PascalFAQ之内存分配
    PascalFAQ编译指示专题
    PascalFAQ编译模式专题
    PascalFAQ编程工具专题
     

    关于本站 | 合作伙伴 | 联系方式
    大榕树 版权所有 ©1999-2006 www.myDrs.org 闽ICP备05000721号