Порядок выполнения в модуле

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Порядок выполнения в модуле

Сообщение VirtUX »

Возможно-ли такое: чтоб перед выполнением любой процедуры/функции определенного модуля выполнялось некоторое действие? Как например есть секция initialization для выполнения определенных действий при инициализации модуля.
Например:
Есть модуль unitA.pas. В нем есть несколько переопределений оперторов. Хочу чтоб перед выполнением каждого переопределенного оператора глобальная переменная fl: boolean; всегда становилась в false. А после выполнения переопределенного оператора, ВОЗМОЖНО, становилась в true. Чтобы не писать в каждом переопределении вначале fl := false;

Код: Выделить всё

...
type
  Info = record
    ...
  end;
...
operator + (il: Info; ir: Info): Info;
operator - (il: Info; ir: Info): Info;
...
var
  fl: boolean;
implementation
...
operator+(il: Info; ir: Info): Info;
begin
  ...
  if ... then fl := true;
end;

operator-(il: Info; ir: Info): Info;
begin
   ... //А, возможно, fl вообще не встретится в переопределении!
end;
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

Думаю, что без хаков тут не обойтись.
Вопрос в соотношении трудозатрат/полезности.

Можно патчить функции на лету (пару комманд асма), можно патчить компилятор :).
Если подобного кода много, то взять нормальный текстовый препроцессор (например m4), и нагенерировать подобного добра сколько хочешь.

Хотя смысл, если честно, непонятен.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

VirtUX писал(а):Как например есть секция initialization для выполнения определенных действий при инициализации модуля.

Ну вы хотите тоже самое но для функций и процедур... и при каждом вызове этих процедур. Мне кажется такого механизма в языке нету.
Правильно будет не использовать хак как предложил MageSlayer, а честно описать инициализацию в каждой функции.

Код: Выделить всё

operator+(il: Info; ir: Info): Info;
begin
  fl := false;
  ...
  if ... then fl := true;
end;

Или попытаться реализовать работу и логику без этой переменной.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Maxizar писал(а):Или попытаться реализовать работу и логику без этой переменной.

Конечно можно и без нее, но с ней было б логичней и кода меньше. Ну да ладно - обойдемся :) На нет и суда нет.
Ответить