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.

verschifft

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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top