3

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

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

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

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

4

2 回答 2

3

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

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

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

于 2017-06-09T09:33:07.193 回答
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”仅确保它被声明,而不是它是范围内的“最接近”。

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

于 2017-06-09T16:05:43.130 回答