Поскольку $I
является директивой компилятора, она может влиять только на код, сгенерированный компилятором, и может влиять только на код, который фактически компилируется.
По этим двум причинам не может влиять на такие вещи, как TFileStream
. Это класс в Classes.pas , который вы не компилируете. На любой код в нем не распространяется директива $I
. Кроме того, компилятор не обрабатывает этот класс специально каким-либо образом. Это просто еще один обычный класс.
Директива $I
влияет на встроенные функции языка, о которых вы упомянули. Компилятор генерирует вызовы этих функций специально. Также влияет на звонки на номера write
, writeln
и readln
. Это также должно повлиять на BlockRead
и BlockWrite
.
Вы можете проверить исходный код. Все, что вызывает SetInOutRes
, восприимчиво к $I
. Это включает в себя функции, которые открывают файлы (Append
, Reset
и Rewrite
), а также все остальное, которое принимает параметр типа file
или TextFile
(Flush
, BlockRead
, * 1029). *, Erase
, FilePos
, Seek
, FileSize
, Read
, Readln
, Write
, Writeln
, Rename
, Eof
, SeekEof
, Eoln
, SeekEol
, Truncate
, SetLineBreakStyle
и CloseFile
). Кроме того, все, что вызывает InOutError
(ChDir
, MkDir
, amd RmDir
).
Заметно отсутствует в списке AssignFile
. Эта функция на самом деле не выполняет никаких операций ввода-вывода. Он просто устанавливает запись файла так, чтобы Append
, Reset
и Rewrite
знали, что делать.
Я должен отметить, что смотреть на исходный код - это просто вывод. Директива $I
определяет, будет ли компилятор вставлять вызовы функции __IOTest
в ваш собственный код после вызова некоторых других функций. Эта функция проверяет значение InOutRes
и, если оно не равно нулю, вызывает ошибку времени выполнения (что может привести к исключению, если SysUtils включен в вашу программу). Мы не можем проверить исходный код, чтобы напрямую выяснить, на какие функции влияет $I
(поскольку он вызывается только в сгенерированном компилятором коде), поэтому мы действительно просто ищем, какие функции set InOutRes
, с предположением, что они не будут делать это, если не будут знать, что компилятор проверит это позже.