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

Can I deduce the type of a type in a compiler directive

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

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

我为什么要这个?
对于特定问题,我交替使用 classrecord
出于速度原因,我想使用记录,但为了方便也想使用 class

出于这个原因,我在两者之间切换。
显然,我可以添加一个 {$define} 语句,但能够自动执行此操作会很好。

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

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

好的,我知道那是肮脏的编程,但你首先要求它。

如果你控制了 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" 只确保它被声明,而不是它是范围内的 "closest"。

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