未记录的编译开关
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 中:
{$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-} 现在毫无意义。
在项目的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 中:
{$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-} 现在毫无意义。