Delphi {$IOCHECKS OFF}会影响哪些API?
我们有一些古老的Delphi代码(甚至可能起源于Turbo Pascal代码),它使用Delphi {$IOCHECKS OFF}会影响哪些API?,delphi,file-io,error-handling,compiler-directives,Delphi,File Io,Error Handling,Compiler Directives,我们有一些古老的Delphi代码(甚至可能起源于Turbo Pascal代码),它使用{$I-},也就是{$ OFF},它使代码用于磁盘I/O错误而不是异常 我想摆脱{$I-}并将此代码带入1990年代,但要做到这一点,我想知道{$IOCHECKS OFF}会对所有代码产生什么影响。这是否只影响像AssignFile/Reset/Rewrite/Append/CloseFile这样的粗糙的旧内置I/O函数?或者它也会影响到像TFileStream这样的现代事物吗?更重要的是,还有什么是我没有想到
{$I-}
,也就是{$
OFF}
,它使代码用于磁盘I/O错误而不是异常
我想摆脱{$I-}
并将此代码带入1990年代,但要做到这一点,我想知道{$IOCHECKS OFF}
会对所有代码产生什么影响。这是否只影响像AssignFile/Reset/Rewrite/Append/CloseFile这样的粗糙的旧内置I/O函数?或者它也会影响到像TFileStream这样的现代事物吗?更重要的是,还有什么是我没有想到的?(这表明它也会影响MkDir和RmDir。如果它影响到它们,则必须有更多。)
Delphi2007帮助主题“输入输出检查(Delphi)”(ms-help://borland.bds5/devcommon/compdirsinput_outputchecking_xml.html
)说这会影响“I/O过程”,并且“I/O过程在Delphi语言指南中有描述。”这没有多大帮助,因为CodeGear从未发布过语言指南,Borland最后一次发货是Delphi 5
在{$I-}
下,哪些函数和类的行为不同
编辑:接受的答案提供了一些很好的背景信息,但下面是按字母顺序排列的列表形式的快速摘要:
{$IOCHECKS OFF}
仅影响系统单元中的以下例程
- 附加
- 块读
- 区块写入
- ChDir
- 关闭文件
- Eof
- 埃隆
- 抹去
- 文件位置
- 文件大小
- 冲洗
- MkDir
- 阅读
- 雷登
- 改名
- 重置
- 重写
- RmDir
- 寻找
- 西科夫
- 西科伦
- SetLineBreakStyle
- 截断
- 写
- 写
$I
是一个编译器指令,它只能影响编译器生成的代码,并且只能影响实际编译的代码
出于这两个原因,它不能影响像TFileStream
这样的事情。它是Classes.pas中的一个类,这是一个您不编译的单元。其中的任何代码都不受$I
指令的影响。此外,编译器没有以任何方式专门处理该类。这只是另一门普通的课
$I
指令会影响您提到的语言内置函数。编译器专门生成对这些函数的调用。它还影响对write
、writeln
和readln
的调用。它还应该影响BlockRead
和BlockWrite
您可以检查源代码。任何调用SetInOutRes
的东西都会受到$I
的影响。它包括打开文件的函数(Append
、Reset
和Rewrite
),以及接受file
或TextFile
类型参数的任何其他函数(Flush
,BlockRead
,BlockWrite
,Erase
,FilePos
,Seek
,FileSize
,Readln
,Writeln
,Writeln
,重命名
,Eof
,SeekEof,ate
、SetLineBreakStyle
和CloseFile
)。此外,任何调用InOutError
(ChDir
,MkDir
,amdRmDir
)的内容
列表中明显缺少AssignFile
。该函数实际上不做任何I/O。它只是设置文件记录,以便Append
、Reset
和Rewrite
知道该做什么
我应该指出,查看源代码只是一种推断。$I
指令控制编译器在调用某些其他函数后是否在您自己的代码中插入对\uu IOTest
函数的调用。该函数检查InOutRes
的值,如果该值不为零,则会引发运行时错误或者(如果您的程序中包含SysUtils,则可能会产生异常)。我们无法检查源代码以直接找出受$I
影响的函数(因为它仅在编译器生成的代码中调用),所以我们实际上只是在寻找哪些函数设置了InOutRes
,假设如果他们不知道编译器会在事后检查它,他们就不会费心去做了。Sweet-很高兴知道如何跟踪这些函数(而且很遗憾,有很多\u Read*
和\u Write*
方法在里面!)但是,看起来您遗漏了三个:SetLineBreakStyle
、SeekEof
和SeekEoln
。另外值得注意的是,这只影响系统单元中的例程。没有其他调用SetInOutRes
或inoutror
。所有\u Read*
和\u Write*
都存在,因为Read
和Write
是编译魔法。编译器会为传递给Read
或Write
的每个参数插入对专用函数的调用。如果启用了$I
,则会插入对\uu IOTest
的调用。