【问题标题】:How to conditionally compile a newer Indy feature?如何有条件地编译更新的 Indy 功能?
【发布时间】:2019-11-11 13:20:15
【问题描述】:

我已经找到this answer 了解如何在运行时检查 Indy 版本,并且有多种不同的方法。但是我正在寻找如何在编译时使用条件来检查 Indy 版本。较新版本的 Indy 中有一个功能,如果它可用,我希望我的开源项目使用此功能。但我需要有条件地编译它。

我找到了IdVers.inc,但这个文件只包含常量 - 没有版本条件。

更具体地说,TIdHTTP 有一个属性HTTPOptions,它有一个新的选择hoWantProtocolErrorContent。如果有的话,我想用它。

如果此选项可用,我如何有条件地使用它?

【问题讨论】:

  • 我认为 Remy 可能会建议如何执行此操作,但同时您可能会查看此 docwiki.embarcadero.com/RADStudio/Rio/en/IF_directive_(Delphi),尤其是 Declared 选项。
  • @MartynA 是的,{$IF Declared(...)} 是处理这个问题的正确方法,例如:{$IF Declared(hoWantProtocolErrorContent)} 或者它必须是完全合格的,我不记得了:{$IF Declared(IdHTTP.TIdHTTPOption. hoWantProtocolErrorContent)

标签: delphi indy conditional-compilation


【解决方案1】:

我认为你可以得到你想要达到的结果使用

{$if declared ...

构造。在 rtl 中的 SysInit.Pas 中有一个使用示例:

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}
  [...]

以及我在评论中提到的文章$If DeclaredD2009 online help中也有这个。

$if declared 适用于类的方法,例如

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

【讨论】:

  • 谢谢,这个问题是专门用{$IF Declared(IdHTTP.TIdHTTPOption.hoWantProtocolErrorContent)}解决的。还有一个我从不知道的巧妙技巧。这在将来肯定会派上用场。使用 RTTI 确保节拍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2018-08-28
  • 2020-02-06
  • 2013-06-08
  • 2017-10-06
相关资源
最近更新 更多