如何有条件地编译较新的Indy功能?

4

我已经找到了关于在运行时检查Indy版本的答案,有多种不同的方法。但是我想知道如何使用条件编译来检查Indy版本。较新版本的Indy中有一项特性,如果可用,我希望我的开源项目能够利用这个特性。但我需要有条件地编译它。

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

更具体地说,TIdHTTP有一个属性HTTPOptions,其中有一个新选项hoWantProtocolErrorContent。如果它可用,我想使用它。

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


1
我想Remy可能能够建议如何做到这一点,但同时您可以查看此http://docwiki.embarcadero.com/RADStudio/Rio/en/IF_directive_(Delphi) ,特别是Declared选项。 - MartynA
1
@MartynA 是的,{$IF Declared(...)}是处理这个问题的正确方式,例如:{$IF Declared(hoWantProtocolErrorContent)}或者也许必须要完全限定,我记不清了:{$IF Declared(IdHTTP.TIdHTTPOption.hoWantProtocolErrorContent)} - Remy Lebeau
1个回答

7
我认为你可以使用以下方法来达到你想要的结果:

我认为您可以通过以下方法实现所需的结果:

{$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 Declared,还有D2009在线帮助文档中的内容。 $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 要好得多。 - Jerry Dodge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接