未记录的编译开关

Undocumented compilation switches

在项目的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+,Z1}

帮助文件中没有描述这些开关。

有人能知道他们的意思吗?

您列出的大部分指令都记录在 Embarcadero 的 DocWiki 中:

Delphi Compiler Directives

{$A8} = 将记录字段对齐到四字对齐方式

{$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 字节

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

解决这些 "undocumented" 的简单方法是从命令行 运行 DCC32.exe,您将看到 您的 [=] 可用的所有编译器选项Delphi 的 16=] 版本。这些年来,一些开关发生了变化。

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 版本?

注意:{$N} 和 {$E} 作为一对处理。

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

{$K-} 智能回调

{$S-} = 堆栈检查。 如果是 {$S+} ,则在每个 procedure/function 的开头插入对堆栈检查例程的调用,以检查局部变量的 space 是否可以保留在堆栈上。导致 EWhosebug(如果使用 SysUtils)或终止并出现 运行 时间错误(如果未使用 SysUtils)如果堆栈中没有足够的 space 用于局部变量。

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

{$N-, E+} 无意义,要么被当作{$N-, E-} 要么导致编译错误。

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

{$N+, E+} Real类型是一个8字节的数学协处理器实数(IEEE real),与Delphi中的Double类型相同。使用数学协处理器(如果存在),否则通过软件模拟(速度慢,但产生与数学协处理器相同的结果)。

{$N+, E-} Real类型是一个8字节的数学协处理器实数(IEEE real),与Delphi中的Double类型相同。数学协处理器必须在 运行 时间存在,否则程序会立即退出并出现 运行 时间错误 "Math coprocessor required, but not present"。

最近的 windows 版本无法 运行 与 CPU 太旧,它没有内置的浮点单元,所以 {$N+} 和{$E-} 现在毫无意义。