Как условно скомпилировать новую функцию Indy? - PullRequest
3 голосов
/ 30 июня 2019

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

Я нашел IdVers.inc, но этот файл содержит только константы - без условий версии.

Точнее, TIdHTTP имеет свойство HTTPOptions с новым выбором hoWantProtocolErrorContent.Если это доступно, я бы хотел использовать его.

Как я могу условно использовать эту опцию, если она доступна?

1 Ответ

5 голосов
/ 01 июля 2019

Я думаю, вы можете получить результат, которого хотите достичь, используя конструкцию

{$if declared ...

.Вот пример его использования в SysInit.Pas в rtl:

function GetTlsSize: Integer;
{$IF defined(POSIX) and defined(CPUX86) and (not defined(EXTERNALLINKER))}
asm
        // Use assembler code not to include PIC base gain
        MOV  EAX, offset TlsLast
end;
{$ELSE}
begin
  Result := NativeInt(@TlsLast);
  {$IF DECLARED(TlsStart)}
  Result := Result - NativeInt(@TlsStart);
  {$ENDIF}
  [...]

. Как и в статье, о которой я упоминал в комментарии: $ Если объявлено , то это такжеэлектронная справка D2009 .

$if declared работает с методами классов, например

procedure TMyClass.DoSomething;
begin
  {$if declared(TMyClass.Added)}  // Added being a procedure of TMyClass
  Added;
  {$endif}
end;
...