Question

Nous avons un code Delphi ancienne (aurait même origine que le code Turbo Pascal) qui utilise {$I-}, alias {$ IOCHECKS OFF}, ce qui rend l'utilisation de code Delphi base suggère que cela affecte également MkDir et RmDir. Si elle affecte ceux-ci, il faut être plus.)

La rubrique d'aide Delphi 2007 « Sortie d'entrée contrôle (Delphi) » (ms-help://borland.bds5/devcommon/compdirsinput_outputchecking_xml.html) dit que cela affecte « la procédure d'E / S [s] », et que « les procédures d'E / S sont décrites dans le Guide du langage Delphi. » Cela ne nous aide pas beaucoup, puisque CodeGear n'a jamais envoyé un guide de langue, et la dernière fois que Borland Delphi était livré un 5.

Quelles sont les fonctions et les classes se comportent différemment sous {$I-}?


EDIT: La réponse acceptée donne un grand fond, mais voici le résumé rapide sous forme de liste alphabétique:. {$IOCHECKS OFF} uniquement affecte les routines suivantes de l'unité du système

  • Append
  • BlockRead
  • BlockWrite
  • ChDir
  • CloseFile
  • Eof
  • Eoln
  • Effacer
  • FilePos
  • FileSize
  • Flush
  • MkDir
  • Lire
  • Readln
  • Renommer
  • Réinitialiser
  • Réécrire
  • RmDir
  • Recherche
  • SeekEof
  • SeekEoln
  • SetLineBreakStyle
  • Tronquer
  • Ecrire
  • Writeln
Était-ce utile?

La solution

Depuis $I est une directive de compilation, il ne peut affecter le code généré par le compilateur, et il ne peut affecter du code qui est effectivement compilé.

Pour ces deux raisons, il ne peut pas affecter des choses comme TFileStream. Il est une classe dans Classes.pas , qui est une unité que vous ne compilez pas. Tout code n'est pas affecté par la directive $I. De plus, le compilateur ne traite pas cette classe spécialement en aucune façon. Il est juste une autre classe ordinaire.

La directive $I affecte les langues fonctions intégrées que vous avez mentionné. Le compilateur génère des appels à ces fonctions spécialement. Elle affecte également les appels à write, writeln et readln. Il devrait également affecter BlockRead et BlockWrite.

Vous pouvez vérifier le code source. Tout ce qui appelle SetInOutRes est sensible à $I. Cela inclut des fonctions qui ouvrent des fichiers (Append, Reset et Rewrite), ainsi que toute autre chose qui accepte un paramètre de type file ou TextFile (Flush, BlockRead, BlockWrite, Erase, FilePos, Seek, FileSize, Read, Readln, Write, Writeln, Rename, Eof, SeekEof, Eoln, SeekEol, Truncate, SetLineBreakStyle et CloseFile). En outre, tout ce qui appelle InOutError (ChDir, MkDir, amd RmDir).

Notamment absent de la liste est AssignFile. Cette fonction ne fait pas réellement des E / S. Il met juste le dossier de fichier afin que Append, Reset et Rewrite saura quoi faire.


Je tiens à souligner qu'en regardant le code source est juste inférence. La directive $I contrôle si le compilateur insère des appels à la fonction __IOTest dans votre propre code après que vous appelez certaines autres fonctions. Cette fonction vérifie la valeur de InOutRes, et si elle est de zéro, il déclenche une erreur d'exécution (qui peut donner une exception si SysUtils est inclus dans votre programme). Nous ne pouvons pas vérifier le code source pour directement En savoir quelles fonctions sont affectées par $I (car il est seulement appelé dans le code généré par le compilateur), donc nous sommes vraiment à la recherche juste pour les fonctions set InOutRes, avec l'hypothèse qu'ils n'embêtez faire que s'ils ne savaient pas le compilateur vérifier ensuite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top