O que todos APIs são afetadas por {$ IOCHECKS OFF}?
-
12-09-2019 - |
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
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.