Pergunta

Nós temos algum código Delphi antiga (poderia até mesmo ter se originado como código Turbo Pascal) que usa {$I-}, aka {$ IOCHECKS OFF}, o que torna o uso de código IOResult vez de exceções para erros de I / O de disco.

Eu quero me livrar do {$I-} e trazer este código para a frente na década de 1990, mas para fazer isso, eu gostaria de saber o que todos é afetado por {$IOCHECKS OFF}. Será que isso só afetam as funções S intrincada velhos built-in I / como AssignFile / Reset / Rewrite / Anexar / CloseFile? Ou que afecta as coisas mais modernas, como TFileStream bem? Mais importante, o que mais pode ser afetada que eu não estou pensando? ( Delphi Basics sugere que ela também afeta MkDir e RmDir. Se ele afeta aqueles, tem de haver mais.)

O tópico de ajuda "verificação de saída de entrada (Delphi)" Delphi 2007 (ms-help://borland.bds5/devcommon/compdirsinput_outputchecking_xml.html) diz que isso afeta "procedimento de I / O [s]", e que "I / procedimentos O são descritos no Guia Linguístico Delphi." Isso não ajuda muito, já que CodeGear nunca enviado um Guia da Língua, ea última vez Borland enviado um era Delphi 5.

Que funções e classes se comportam de forma diferente sob {$I-}?


EDIT: a resposta aceita dá algum grande fundo, mas aqui está o resumo rápido em forma de lista em ordem alfabética: {$IOCHECKS OFF} única afeta os seguintes rotinas da unidade do Sistema

  • Anexar
  • BlockRead
  • BlockWrite
  • ChDir
  • CloseFile
  • Eof
  • Eoln
  • Erase
  • FilePos
  • FileSize
  • Lave
  • MkDir
  • Leia
  • readln
  • Rename
  • reset
  • Rewrite
  • RmDir
  • Procure
  • SeekEof
  • SeekEoln
  • SetLineBreakStyle
  • truncar
  • Write
  • Writeln
Foi útil?

Solução

Desde $I é uma directiva do compilador, só pode afetar o código gerado pelo compilador, e isso só pode afetar o código que realmente é compilado.

Para essas duas razões, não pode afetam coisas como TFileStream. É uma classe em Classes.pas , que é uma unidade você não compilar. Qualquer código que não é afetada pela directiva $I. Além disso, o compilador não tratar essa classe especial de qualquer forma. É apenas outra classe comum.

A directiva $I afeta a linguagem built-in funções que você mencionou. O compilador gera as chamadas para as funções especialmente. Ela também afeta as chamadas para write, writeln e readln. Ele também deve afetar BlockRead e BlockWrite.

Você pode verificar o código-fonte. Qualquer coisa que chama SetInOutRes é suscetível a $I. Isso inclui funções que os arquivos abertos (Append, Reset e Rewrite), bem como qualquer outra coisa que aceita um parâmetro do tipo file ou TextFile (Flush, BlockRead, BlockWrite, Erase, FilePos, Seek, FileSize, Read, Readln, Write, Writeln, Rename, Eof, SeekEof, Eoln, SeekEol, Truncate, SetLineBreakStyle, e CloseFile). Além disso, qualquer coisa que as chamadas InOutError (ChDir, MkDir, amd RmDir).

Notadamente ausente da lista é AssignFile. Essa função não realmente fazer qualquer I / O. Ele só configura o registro arquivo para que Append, Reset e Rewrite vai saber o que fazer.


Gostaria de salientar que olhar para o código-fonte é apenas inferência. Os controles directiva $I se o compilador irá inserir chamadas para a função __IOTest em seu próprio código depois que você chamar algumas outras funções. Essa função verifica o valor do InOutRes, e se não é zero, ele gera um erro de tempo de execução (que pode produzir uma exceção se SysUtils está incluído no seu programa). Não podemos verificar o código-fonte para diretamente descobrir o que funções são afetadas por $I (uma vez que só é chamado em código gerado pelo compilador), então estamos realmente olhando apenas para as quais funções set InOutRes, com a suposição de que eles não me incomodaria de fazer isso se eles não sabia o compilador iria verificar para ele mais tarde.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top