4

{$I-}、別名を使用する古いDelphiコード(Turbo Pascalコードとして作成された可能性もあります)があります。これにより、コードはディスクI/Oエラーの例外の代わりにIOResultを使用します。{$IOCHECKS OFF}

を取り除き、{$I-}このコードを1990年代に持ち込みたいのですが、そのためには、すべてがの影響を受けるものを知りたいと思い{$IOCHECKS OFF}ます。これは、AssignFile / Reset / Rewrite / Append/CloseFileのような古い組み込みのI/O関数にのみ影響しますか?それとも、TFileStreamのようなより現代的なものにも影響しますか?さらに重要なことに、私が考えていない他に何が影響を受ける可能性がありますか?(Delphi Basicsは、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} のみ影響します。

  • 追加する
  • BlockRead
  • BlockWrite
  • ChDir
  • CloseFile
  • Eof
  • Eoln
  • 消去
  • FilePos
  • ファイルサイズ
  • 流す
  • MkDir
  • 読む
  • Readln
  • 名前を変更
  • リセット
  • リライト
  • RmDir
  • 求める
  • SeekEof
  • SeekEoln
  • SetLineBreakStyle
  • 切り捨てる
  • 書く
  • Writeln
4

1 に答える 1

5

はコンパイラ指令であるため$I、コンパイラで生成されたコードにのみ影響し、実際にコンパイルされるコードにのみ影響します。

これらの2つの理由により、のようなものには影響しませTFileStreamん。これはClasses.pasのクラスであり、コンパイルしないユニットです。その中のコードは、$Iディレクティブの影響を受けません。さらに、コンパイラはそのクラスを特別に処理しません。それはただの普通のクラスです。

$Iディレクティブは、あなたが言及した言語の組み込み関数に影響を与えます。コンパイラは、これらの関数への呼び出しを特別に生成します。、、、およびへwriteの呼び出しにも影響します。とにも影響するはずです。writelnreadlnBlockReadBlockWrite

ソースコードを確認できます。呼び出すSetInOutResものはすべて。の影響を受けやすくなり$Iます。これには、ファイル(Append、、、Resetおよび)を開く関数のほか、タイプまたは(、、、、、、、、、、、、、、、、、、、、、、、、および)のパラメーターをRewrite受け入れるその他の関数が含まれます。また、(、、amd )を呼び出すものはすべて。fileTextFileFlushBlockReadBlockWriteEraseFilePosSeekFileSizeReadReadlnWriteWritelnRenameEofSeekEofEolnSeekEolTruncateSetLineBreakStyleCloseFileInOutErrorChDirMkDirRmDir

特にリストにないのはAssignFileです。その関数は実際にはI/Oを実行しません。、、が何をすべきかを知るようにファイルAppendレコードを設定するだけです。ResetRewrite


ソースコードを見ることは単なる推論であることを指摘しておきます。$Iディレクティブは、他の特定の関数を呼び出した後、コンパイラが関数の呼び出しを独自のコードに挿入するかどうかを制御し__IOTestます。この関数はの値をチェックし、ゼロでない場合は実行時エラーを発生させます( SysUtilsInOutResがプログラムに含まれている場合は例外が発生する可能性があります)。ソースコードをチェックして、影響を受ける関数を直接見つけることはできません(コンパイラーで生成されたコードでのみ呼び出されるため)。したがって、実際には、どの関数が設定されているかを探しています。コンパイラが後でそれをチェックすることを彼らが知らなかった場合、それを行います。$I InOutRes

于 2009-07-09T22:56:16.310 に答える