{$IOCHECKS OFF} の影響を受けるすべての API はどれですか?
-
12-09-2019 - |
質問
古代の Delphi コード (Turbo Pascal コードとして起源した可能性もあります) がいくつかあります。 {$I-}
, 、別名 {$
IOCHECKS
OFF}
, 、コードで使用するようになります IO結果 ディスク I/O エラーの例外の代わりに。
をなくしたい {$I-}
このコードを 1990 年代に持ち込むことになりますが、そのためには、すべてが何に影響されるのかを知りたいと思っています。 {$IOCHECKS OFF}
. 。これは、AssignFile / Reset / Rewrite / Append / CloseFile などの古い組み込み I/O 関数にのみ影響するのでしょうか?それとも、TFileStream などのより新しいものにも影響を与えるのでしょうか?さらに重要なのは、私が思いもよらない影響を受ける可能性のあるものは他に何があるでしょうか?(Delphi の基本 MkDir と RmDir にも影響を与えることを示唆しています。それがそれらに影響を与えるなら、もっとあるはずです。)
Delphi 2007 ヘルプ トピック「入出力チェック (Delphi)」(ms-help://borland.bds5/devcommon/compdirsinput_outputchecking_xml.html
)これは「I/O手順」に影響し、「I/O手順はDelphi Language Guideに記載されている」と述べています。 CodeGearが言語ガイドを出荷したことがなく、Borlandが最後に出荷されたのはDelphi 5でした。
どの関数とクラスが異なる動作をするか {$I-}
?
編集: 受け入れられた回答は優れた背景を提供しますが、アルファベット順のリスト形式で簡単に要約すると次のようになります。 {$IOCHECKS OFF}
のみ システムユニットからの次のルーチンに影響を与えます。
- 追加
- ブロック読み取り
- ブロックライト
- ChDir
- ファイルを閉じる
- イオフ
- エオルン
- 消去
- ファイル位置
- ファイルサイズ
- 流す
- MkDir
- 読む
- リードリン
- 名前の変更
- リセット
- リライト
- RmDir
- 求める
- シークEof
- シークエルン
- 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
、Read
、Readln
、Write
のパラメータを受け入れる関数が含まれ、 Writeln
、Rename
、Eof
、SeekEof
、Eoln
、SeekEol
、Truncate
、SetLineBreakStyle
、およびCloseFile
)。また、(InOutError
、ChDir
、AMD MkDir
)RmDir
を呼び出すもの。
リストから不在が目立つAssignFile
です。この関数は、実際には任意のI / Oを行いません。それはちょうど、そのAppend
ので、ファイルレコードを設定しReset
、およびRewrite
は何をすべきか知っているだろう。
私は、ソースコードを見ることがちょうど推論であることを指摘すべきです。 $I
ディレクティブを使用すると、特定の他の関数を呼び出した後、コンパイラは、独自のコードで__IOTest
関数への呼び出しを挿入するかどうかを制御します。この関数は、InOutRes
の値をチェックし、それがゼロではない場合、それは(のsysutilsのはあなたのプログラムに含まれている場合に例外を生成することができる)実行時エラーが発生します。私たちは、の直接の(それが唯一のコンパイラによって生成されたコードで呼ばれていますので)関数は$I
の影響を受けているものを見つけるのソースコードを確認することができないので、私たちは本当にただの関数はをどの探しています設定の彼らは、コンパイラを知らなかった場合は、その後、それをチェックすることをやって気にしないだろうと仮定してInOutRes
、ます。