所有API受{$ IOCHECKS OFF}影响的是什么?

Joe*_*ite 4 delphi error-handling file-io compiler-directives

我们有一些古老的Delphi代码(可能甚至起源于Turbo Pascal代码),它们使用{$I-},也就是说,它使代码使用IOResult而不是磁盘I/O错误的异常.{$IOCHECKS OFF}

我想摆脱这个{$I-}并将这个代码推进到20世纪90年代,但为了做到这一点,我想知道所有受到影响的是什么{$IOCHECKS OFF}.这只会影响Crufty旧的内置I/O函数,如AssignFile/Reset/Rewrite/Append/CloseFile吗?或者它是否会影响TFileStream等更现代的东西?更重要的是,还有什么可能会影响到我没想到的?(Delphi Basics建议它也会影响MkDir和RmDir.如果它影响那些,那么必须有更多.)

Delphi 2007帮助主题"输入输出检查(Delphi)"(ms-help://borland.bds5/devcommon/compdirsinput_outputchecking_xml.html)表示这会影响"I/O过程[s]",并且"在Delphi语言指南中描述了I/O过程".这没有多大帮助,因为CodeGear从未发布语言指南,而Borland最后一次发布的是Delphi 5.

哪些功能和类的行为不同{$I-}


编辑:接受的答案提供了一些很好的背景,但这里是按字母顺序排列的列表形式的快速摘要:{$IOCHECKS OFF} 影响系统单元中的以下例程.

  • 附加
  • BlockRead
  • BlockWrite命令
  • CHDIR
  • CloseFile
  • EOF
  • EOLN
  • 抹去
  • FilePos
  • 文件大小
  • 红晕
  • MKDIR
  • Readln
  • 改名
  • 重启
  • 改写
  • RmDir会
  • 寻求
  • SeekEof
  • SeekEoln
  • SetLineBreakStyle
  • 截短
  • Writeln

Rob*_*edy 5

由于它$I是一个编译器指令,它只能影响编译器生成的代码,它只能影响实际编译的代码.

由于这两个原因,它不会影响像TFileStream.它是Classes.pas中的一个类,它是一个你不编译的单元.其中的任何代码都不受$I指令的影响.此外,编译器不会以任何方式特别对待该类.这只是另一个普通的课程.

$I指令会影响您提到的语言内置函数.编译器专门生成对这些函数的调用.它还会影响调用write,writelnreadln.它也应该影响BlockReadBlockWrite.

您可以查看源代码.任何调用SetInOutRes都容易受到影响$I.这包括函数,打开文件(Append,Reset,和Rewrite),以及其他任何接受类型的参数fileTextFile(Flush,BlockRead,BlockWrite,Erase,FilePos,Seek,FileSize,Read,Readln,Write,Writeln,Rename,Eof,SeekEof,Eoln,SeekEol,Truncate,SetLineBreakStyle,和CloseFile).此外,任何调用InOutError(ChDir,MkDir,AMD RmDir).

值得注意的是,名单中没有AssignFile.该功能实际上并不执行任何I/O. 它只是规定了文件记录,这样Append,ResetRewrite会知道该怎么做.


我应该指出,查看源代码只是推断.该$I指令控制__IOTest在调用某些其他函数后,编译器是否将在您自己的代码中插入对函数的调用.该函数检查值InOutRes,如果它不为零,则会引发运行时错误(如果程序中包含SysUtils,则可能会产生异常).我们无法检查源代码直接找出受影响的函数$I(因为它只在编译器生成的代码中调用),所以我们真的只是在寻找哪些函数 InOutRes,假设它们不会打扰如果他们不知道编译器会在之后检查它.