我们有一些古老的Delphi代码(可能甚至起源于Turbo Pascal代码)使用{$I-}
,又称{$
IOCHECKS
OFF}
,这使得代码使用{ {3}}而不是磁盘I / O错误的例外。
我想摆脱{$I-}
并将此代码推进到20世纪90年代,但要做到这一点,我想知道所有受{$IOCHECKS OFF}
的影响。这只会影响Crufty旧的内置I / O函数,如AssignFile / Reset / Rewrite / Append / CloseFile吗?或者它是否会影响TFileStream等更现代的东西?更重要的是,还有什么可能会影响到我没想到的? (IOResult表明它也会影响MkDir和RmDir。如果它影响到那些,则必须有更多。)
Delphi 2007帮助主题“输入输出检查(Delphi)”(ms-help://borland.bds5/devcommon/compdirsinput_outputchecking_xml.html
)表示这会影响“I / O过程[s]”,并且“I / O过程在Delphi语言中描述”指南。”这没有多大帮助,因为CodeGear从未发布语言指南,Borland最后一次发布的是Delphi 5。
{$I-}
下哪些函数和类的行为有所不同?
编辑:接受的答案提供了一些很好的背景知识,但这里是按字母顺序排列的列表形式的快速摘要:{$IOCHECKS OFF}
仅影响系统中的以下例程单元。
答案 0 :(得分:5)
由于$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
,Read
,{{ 1}},Readln
,Write
,Writeln
,Rename
,Eof
,SeekEof
,Eoln
,{{1} },SeekEol
和Truncate
)。此外,任何调用SetLineBreakStyle
(CloseFile
,InOutError
,amd ChDir
)的内容。
明显缺席的是MkDir
。该功能实际上并不执行任何I / O.它只是设置文件记录,以便RmDir
,AssignFile
和Append
知道该怎么做。
我应该指出,查看源代码只是推断。 Reset
指令控制在调用某些其他函数后编译器是否会在您自己的代码中插入对Rewrite
函数的调用。该函数检查$I
的值,如果它不为零,则会引发运行时错误(如果程序中包含 SysUtils ,则可能会产生异常)。我们无法直接检查源代码 找出__IOTest
影响哪些函数(因为它只在编译器生成的代码中调用),所以我们真的只是在找函数 set InOutRes
,假设如果他们不知道编译器会在之后检查它,他们就不会这么做了。