Was alle APIs werden von {$ IOCHECKS OFF} betroffen?
-
12-09-2019 - |
Frage
Wir haben einige alte Delphi-Code (vielleicht entstanden auch als Turbo Pascal-Code), der verwendet {$I-}
, auch bekannt als {$
IOCHECKS
OFF}
, die den Code Gebrauch macht Delphi Basics legt nahe, dass es wirkt sich auch MkDir und RmDir. Wenn es betrifft diejenigen, gibt es mehr sein.)
Die Delphi 2007 Hilfethema "Input Output Überprüfung (Delphi)" (ms-help://borland.bds5/devcommon/compdirsinput_outputchecking_xml.html
) sagt, dass dies beeinflusst "I / O-Verfahren [s]", und dass "E / A-Verfahren sind in dem Delphi-Language Guide beschrieben." Dies hilft nicht viel, da CodeGear hat noch nie einen Language Guide, und das letzte Mal, Borland ausgeliefert war Delphi 5.
Welche Funktionen und Klassen verhalten sich anders unter {$I-}
?
EDIT: Die akzeptierte Antwort gibt einigen großen Hintergrund, aber hier ist die kurze Zusammenfassung in alphabetischer Liste Form:. {$IOCHECKS OFF}
nur wirkt dich auf die folgenden Routinen von der Systemeinheit
- Anfügen
- Read
- Blockwrite
- ChDir
- Closefile
- Eof
- Eoln
- Löschen
- FilePos
- Filesize
- Flush
- MkDir
- Lesen
- Readln
- Umbenennen
- Zurücksetzen
- Rewrite
- RmDir
- Suchen
- SeekEof
- SeekEoln
- SetLineBreakStyle
- Kürzen
- Schreiben
- Writeln
Lösung
Da $I
ist ein Compiler-Direktive, kann es nur Compiler generierten Code beeinflussen, und es kann nur Code auswirken, wird tatsächlich erstellt.
Für diesen beiden Gründen ist es nicht beeinflussen Dinge wie TFileStream
. Es ist eine Klasse in Classes.pas , die eine Einheit, die Sie kompilieren nicht ist. Jeder Code in es ist nicht von der $I
Richtlinie betroffen. Darüber hinaus wird der Compiler nicht die Klasse speziell in irgendeiner Art und Weise behandeln. Es ist nur eine andere gewöhnliche Klasse.
Die $I
Richtlinie wirkt sich auf die Sprache integrierte Funktionen, die Sie erwähnt haben. Der Compiler erzeugt Anrufe auf diese Funktionen speziell. Es wirkt sich auch auf Anrufe zu write
, writeln
und readln
. Es sollte auch BlockRead
und BlockWrite
beeinflussen.
Sie können prüfen, den Quellcode. Alles, was SetInOutRes
nennt, ist anfällig für $I
. Dazu gehören Funktionen zum Öffnen von Dateien (Append
, Reset
und Rewrite
), sowie alles andere, was einen Parameter vom Typ file
oder TextFile
akzeptiert (Flush
, BlockRead
, BlockWrite
, Erase
, FilePos
, Seek
, FileSize
, Read
, Readln
, Write
, Writeln
, Rename
, Eof
, SeekEof
, Eoln
, SeekEol
, Truncate
, SetLineBreakStyle
und CloseFile
). alles auch, dass Anrufe InOutError
(ChDir
, MkDir
, amd RmDir
).
Vor allem aus der Liste fehlt AssignFile
. Diese Funktion tut eigentlich keine I / O. Es richtet nur die Datei Datensatz, so dass Append
, Reset
und Rewrite
wird wissen, was zu tun ist.
Ich möchte darauf hinweisen, dass auf den Quellcode einfach nur Folgerung ist. Die $I
Direktive steuert, ob der Compiler Aufrufe an die __IOTest
Funktion in Ihrem eigenen Code einfügen, nachdem Sie bestimmte andere Funktionen aufrufen. Diese Funktion prüft den Wert von InOutRes
, und wenn es nicht Null ist, es stellt einen Laufzeitfehler (die eine Ausnahme ergeben können, wenn SysUtils in Ihrem Programm enthalten). Wir können nicht den Quellcode überprüfen direkt herauszufinden, welche Funktionen von $I
betroffen sind (da es nur in Compiler generierte Code genannt), so dass wir wirklich nur auf der Suche, für die Funktionen set InOutRes
, mit der Annahme, dass sie nicht stören würden tun, wenn sie nicht den Compiler wissen es würde überprüfen danach.