编译指示器
编译指示器
编译指示器(编译开关)的使用(1)数据对齐(Align Data) 2)布尔运算(Boolean Evaluation) 3)调试信息(Debug Information) 4)浮点仿真(Emulation) 5)输入输出检查(Input/Output Checking) 6)数字处理(Numberic Processing) 7)范围检查(Range Checking) 8)栈溢出检查(Stack Overflow Checking) 9)变量串检查(Var String Checking))
简介
在pascal中有一种编译指示器——编译开关,在编译窗口中连按两下“ctrl+o”可以在程序头中出现所有编译开关情况,也可以自己书写。
编译指示器(编译开关)的使用
下面是一些常见指示器(开关)所代表的意思:
1)数据对齐(Align Data)
{$A+}或{$A-}
在{$A+}状态下,将非字符按偶地址对齐存放,可以提高8086和80286存取数据的速度。不影响字节变量、记录域结构和数组元素。在{$A-}状态下,将使用字节对齐方式,数据可存放在奇地址或偶地址。
2)布尔运算(Boolean Evaluation)
{$B+}或{$B-}
在{$B+}状态下,编译器产生完全布尔表达式运算代码。布尔表达式中的每个操作都确保被计算。既是整个表达式的结果以确定,还继续运算其余的表达式。
在{$B-}状态下,编译器产生短路布尔表达式运算代码。接着从左到右运算,当整个表达式结果确定后,就停止运算。
3)调试信息(Debug Information)
{$D+}或{$D-}
{$D+}产生调试信息,它在编译程序或单元产生运行错误时,能自动定位引起错误的语句。
4)浮点仿真(Emulation)
{$E+}或{$E-}
{$E+}只是在8087协处理器不存在时,将连接运行库以便对协处理器进行仿真。
{$N+,$E+}状态编译程序,系统将同8087仿真器连接,得到exe文件,不管有无8087,都可以在机器上进行IEEE标准754的二进制浮点运算。
{$N+,$E-}状态下,只能在有8087时,才能进行IEEE标准754的二进制浮点运算。
8087仿真开关如果用在一个单元是无效的,它只能用于程序的编译。
5)输入输出检查(Input/Output Checking)
{$I+}或{$I-}
$I指示控制是否自动产生对调用过程的结果进行检查。
6)数字处理(Numberic Processing)
{$N+}或{$N-}
{$N-}状态,在机器上只能进行实数类型运算。在{$N+}状态,在有8087协处理器或没有用{$E+}指示对8087进行仿真,都可以对IEEE浮点类型进行运算。
7)范围检查(Range Checking)
{$R+}或{$R-}
$R+进行边界和范围检查
8)栈溢出检查(Stack Overflow Checking)
{$S+}或{$S-}
在{$S+}状态下编译,程序在每个过程或函数的开始生成一段代码,用于检查是否有足够的栈空间供局部变量使用。若栈空间不够,程序停止运行,并显示运行错误。
在{$S+}状态下这样调用会导致系统崩溃。
9)变量串检查(Var String Checking)
{$V+}或{$V-}
在{$V+}状态下,实行严格的类型检查,要求形参、实参具有同一字符串类型。
在{$V+}状态下,允许任意类型的字符串变量作为实参,甚至是一实参的最大长度不同于形参长度。BP7下的最佳参数是:
{$A+,B-,D-,E-,F-,G+,I-,L-,N+,O-,P+,Q-,R-,S-,T-,V-,X+,Y-}
{$M 65520,0,655360}
其中D和L与调试有关,调试时必须打开这两个参数
N+可以使程序能够使用扩展实型。一般情况下,Real速度最慢,不应该使用。
在编辑环境下按Ctrl+O+O,可以自动列出默认的编译指示,然后再自己改。
参数编译指示
符号 缺省值或格式 类型 功能
M M 16384 0 655360 全程 动态内存分配 实模式 规定栈尺寸,堆最小尺寸,堆最大尺寸
O O单元名 局部 覆盖单元开关(此单元必须是用编译指
示的{$O+}状态编译的单元
编译开关指示:
符号 类型 具体含义
A: 全程 按地址对齐
默认和优化:A+ 所有大于一安茸的变量或类型常数均从偶地址开始存放
A- 变量或类型常数均简单地放在下一可用地址
B: 全程 布尔计值控制
默认: B+ 执行完全布尔值计值运算
优化: B- 执行短路布尔值计算
D: 全程 调试信息开关
默认: D+ 将调试信息保存在一个行号表中,当运行出错时指示出错处
优化: D- 不产生调试信息行号表
E 全程 浮点运算仿真
默认: E+ 不出现8087数字协处理器时,运算允许用运行库仿真
优化: E- 必须有8087数字协处理器才能进行浮点运算
F 局部 强制远程调用
F+ 对子程序总是远程调用
默认和优化: F- 由PASCAL 自动选择对子程序的调用方式
I 局部 I/O出错检查
默认: I+ 系统执行I/O出错检查
优化: I- 系统不执行I/0出错检查
L 全程 局部符号开关
默认:L+ 产生某一模块的局部符号信息,使IDE可检查和修改模块的局部变量。
优化:L- 不产生某一模块的符号信息
N 全程 数字协处理器
默认: N- 不使用数字协处理器,实型数运算以软件实现
优化: N+ 使用数字协处理器,以硬件实现各类实型运算
O 全程 产生覆盖代码
默认和优化: O- 不产生覆盖代码
O+ 控制产生覆盖代码,经常与高度远程调用编译指示{$F+}连用
P 全程 不定长字串参数
默认: P- 不使用不定长字符串参数
优化: P+ STRING类型的字符串实参不预先确定其最大长度,调用子程序时自动设计为与实际参数一致。
Q 全程 整数溢出检查
默认和优化: Q- 整数运算不检查溢出错误
Q+ 检查溢出错误
R 局部 下标范围检查
默认和优化: R- 不执行上述检查
R+ 对运算时所有数组和字符串的下标表达式检查其值是否越界,并对变量和子界的测试值检查是否在指定的范围内
S 局部 栈空间域检查
默认: S+ 在每次子程序调用前检查是否有足够的调用空间
优化: S- 不执行上述检查
T 局部 指针类型检查
默认和优化: T- @操作返回结果类型为无类型指针
T+ @操作返回结果为类型指针
常用参数编译指示表:
字母 缺省值或格式 类型 实模式 保护模式 Windows 功能 具体含义
D D 正文 全程
√ √ 描
述
执
行
文
件 把所描述的正文插入到.exe或.dll文件的标题中,不在单元中使用。
I I 文件名 局部 √ √ √ 插
入
程
序
文
件 把源文件代码包含进所在程序一起编译。包含文件可以嵌套。
L L 文件名 局部 √ √ √ 链
接
目
标
文
件 指示编译器链接一个已编译的程序或单元的目标文件.obj。
M 实模式 全程 √ √ √ 动
态
内
存
分
配 实模式
M 16384,0,655360 规定栈尺寸、堆最小尺寸、堆最大尺寸。
保护模式 保护模式
M 16384 规定栈尺寸。
Windows模式 Windows模式
M 8192,8192 规定栈尺寸、堆尺寸。
O O 单元名 局部 √
覆
盖
单
元
开
关 把所指单元变成一覆盖单元。此单元必须是用编译指示{$O+}状态编译的单元。
R R 文件名 局部
√ √ 指
定
资
源
文
件 指定插入到应用程序或库文件的Windows资源文件。