- Код: Выделить всё
procedure AppendLog(const LogKind: TLogKind; const Text: sting);
begin
if LogKind in LogKinds then WriteLn(LogFile, Text);
end;
//...
AppendLog(lkDebug, 'ErrCode='+IntToStr(ErrCode)+' "'+SysErrorMessage(ErrCode)+'"');
//...
В чем суть. Если глобальное множество LogKinds не содержит элемент lkDebug, то в лог не будет попадать соответствующая строка. Но проблема в том, что она все равно будет сформирована, будут вызваны функции IntToStr() и SysErrorMessage(), несколько раз будет перевыделена память и произведена конкатенация элементов строки. И все это для того, чтобы уже внутри функции понять, что ничего сохранять не нужно. В итоге большие и совершенно неоправданные потери времени. Проверка множества перед вызовом AppendLog() конечно решает проблему, но загромождает код.
На первый взгляд должна была помочь директива inline, но ассемблерный листинг показал, что "разворачивание" процедуры производится просто в месте (и вместо) ее вызова, все подготовительные действия выполняются точно так же, хотя как раз в этом случае можно было бы сгенерить такой код:
- Код: Выделить всё
//...
if lkDebug in LogKinds then WriteLn(LogFile, 'ErrCode='+IntToStr(ErrCode)+' "'+SysErrorMessage(ErrCode)+'"');
//...
Которого я ожидал и который решил бы проблему...
Короче, нет ли в FPC чего-нибудь типа сишных макросов, которые просто подставляли бы в нужное место шаблонный код без предварительного вычисления переданных в качестве параметров выражений?