Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi {$IOCHECKS OFF}会影响哪些API?_Delphi_File Io_Error Handling_Compiler Directives - Fatal编程技术网

Delphi {$IOCHECKS OFF}会影响哪些API?

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这样的现代事物吗?更重要的是,还有什么是我没有想到

我们有一些古老的Delphi代码(甚至可能起源于Turbo Pascal代码),它使用
{$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
,amd
RmDir
)的内容

列表中明显缺少
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
的调用。