我可以在编译器指令中推断出类型的类型

时间:2017-06-09 08:17:42

标签: delphi compiler-directives

是否可以像这样创建一个条件定义:

{$if typeof(TNode) = record}
type PNode = ^TNode;
{$else}
type PNode = TNode;
{$end}

为什么我要这个?
对于特定问题,我在使用classrecord之间进行交替 我想出于速度原因使用记录,但为了方便起见,我还想使用class

因此我在两者之间切换 显然我可以添加一个{$define}语句,但能够自动化它会很好。

2 个答案:

答案 0 :(得分:3)

虽然我个人推荐一般的DEFINE方法,但在记录不具备特定尺寸的情况下,您可能会成功:

{$if Sizeof(TNode) <> Sizeof(Pointer)}
type PNode = ^TNode;
{$else}
type PNode = TNode;
{$end}

好的,我知道这是糟糕的编程,但你首先要求它。

答案 1 :(得分:1)

如果你控制TNode的两个定义,你可以这样做(不需要在同一个单元中,但必须引用相同的常量):

const
  NODE_IS_RECORD = False;

type
{$if NODE_IS_RECORD}
  TNode = record

  end;
  PNode = ^TNode;
{$ELSE}
  TNode = class

  end;
  PNode = TNode;
{$IFEND}

如果你只控制1个TNode声明,你仍然可以这样做:

{Unit1}
type
  TNode = record

  end;
  PNode = ^TNode;

{Unit2}
{$IF not DECLARED(PNode)}
  //if you don't use the unit where TNode is a record, then PNode shouldn't be declared.
  PNode = TNode;
{$ENDIF}

如果你既没有控制声明,但是它们是以不同的单位声明的(实际上,我认为这是必需的......)并且你从不同时使用它们,或者使用两者总是意味着你想要使用特定的PNode声明:

{$IF DECLARED(UnitContainingTNodeAsRecord)}
  PNode = ^TNode;
{$ELSE}
  PNode = TNode;
{$IFEND}

如果您在使用中同时使用这两个单位,则可能需要在TNode前加上单位名称。 “DECLARED”仅确保声明它,而不是它是“最接近”的范围。

我认为这涵盖了大多数情况。