未记录的编译开关

时间:2018-01-06 23:33:36

标签: delphi-7

在项目dof和cfg文件中,它们是一些未记录的开关:E,F,K,N和S.它们在使用ctrl-O-O插入开关时也会出现:

{$ A8,B-,C +,d +, E-,F - 下,G +,H +,I +,J - , - 的的K - 下,L +,M- , N + 下,O +,p +,Q-,R - , - 的的S - 下,T-,U-,V +,W-,X +,Y +,Z 1}

帮助文件中未介绍这些开关。 delphi7 compilation switches

有人可以获得有关其含义的任何信息吗?

3 个答案:

答案 0 :(得分:1)

解决这些“未记录的”的简单方法是从命令行运行DCC32.exe,您将看到您的版本的Delphi可用的所有编译器选项。多年来,一些开关已经改变。

Turbo Pascal/Borland Pascal:
Compiler switches: -$<letter><state>  (defaults are shown below)
  A+ Word alignment       I+ I/O error checking   R- Range checking
  B- Full boolean eval    L+ Local debug symbols  **S+ Stack checking**
  D+ Debug information    **N- 80x87 instructions**   T- Typed pointers
  **E+ 80x87 emulation**      O- Overlays allowed     V+ Strict var-strings
  **F- Force FAR calls**      P- Open string params   X+ Extended syntax
  G- 80286 instructions   Q- Overflow checking
Memory sizes: -$M<stack>,<heapmin>,<heapmax>  (default: 16384,0,655360)

我仍然在Pascal中编译,所以我认识到这些...... $ K不是来自Turbo Pascal时代,也不是Free Pascal,也不是Delphi 7或更早版本。 (我不比D7更新 - 所以也许是CodeGear或Embarcadero版本?

答案 1 :(得分:1)

注意:{$ N}和{$ E}是成对处理的。

{$ F-} =强制远距离调用(仅Turbo Pascal / Borland Pascal和Delphi 1(16位);在较新的Delphis中不执行任何操作)

{$ K-}智能回调

{$ S-} =堆栈检查。 如果{$ S +},则在每个过程/函数的开始处插入对堆栈检查例程的调用,以检查是否可以在堆栈上保留用于局部变量的空间。如果堆栈中没有足够的空间用于局部变量,则导致EStackOverflow(如果已使用SysUtils)或终止于运行时错误(如果未使用SysUtils)。

{$ N +}和{$ E-}: 这些用于Turbo Pascal。 (可能还有Delphi 1吗?) 在较新的Delphis中,没有使用它们,但是请参阅Real48类型和{$ REALCOMPATIBILITY}指令。

{$ N-,E +}毫无意义,被视为{$ N-,E-}或导致编译错误。

{$ N-,E-}实数类型是6字节(= 48位)的软件实数。不使用数学协处理器(即使存在)。

{$ N +,E +}实数类型是8字节的数学协处理器实数(IEEE实数),与Delphi中的Double相同。将使用数学协处理器(如果存在),否则将通过软件进行仿真(速度较慢,但​​产生的结果与数学协处理器相同)。

{$ N +,E-}实数类型是8字节的数学协处理器实数(IEEE实数),与Delphi中的Double相同。数学协处理器必须在运行时存在,否则程序会立即退出,并显示运行时错误“需要数学协处理器,但不存在”。

最近的Windows版本无法在如此旧的CPU上运行,以至于它没有内置的浮点单元,因此{$ N +}和{$ E-}现在变得毫无意义。

答案 2 :(得分:0)

您列出的大多数指令都记录在Embarcadero的DocWiki:

Delphi Compiler Directives

{$ A8} =将记录字段与QuadWord对齐

对齐

{$ B-} =启用布尔短路评估

{$ C +} =启用断言

{$ D +} =启用调试信息

{$ E-} =?

{$ F-} =?

{$ G +} =启用导入的数据引用

{$ H +} =启用长字符串(将String类型设置为AnsiString) - 在现代Delphi版本中忽略

{$ I +} =启用I / O过程检查

{$ J-}​​ =禁用可写常量

{$ K-} =?

{$ L +} =启用本地符号信息

{$ M-} =禁用运行时类型信息

{$ N +} =?

{$ O +} =启用代码优化

{$ P +} =启用打开字符串参数 - 在现代Delphi版本中忽略

{$ Q-} =禁用溢出检查

{$ R-} =禁用范围检查

{$ S-} =?

{$ T-} =禁用类型检查指针

{$ U-} =禁用奔腾安全的浮点除法运算

{$ V +} =启用严格检查短字符串参数

{$ W-} =仅在需要时生成堆栈帧

{$ X +} =启用扩展语言语法

{$ Y +} =生成符号交叉引用信息

{$ Z1} =将最小枚举大小设置为1个字节

正如您所看到的,自Delphi 7发布15年后,您所询问的5个特定开关仍然没有记录。所以不知道他们实际上做了什么,如果有的话。