是否可以像这样创建条件定义:
{$if typeof(TNode) = record}
type PNode = ^TNode;
{$else}
type PNode = TNode;
{$end}
我为什么要这个?
我在使用class
和record
针对特定问题之间交替使用。
出于速度原因,我想使用记录,但也想class
使用方便。
出于这个原因,我在两者之间切换。
显然我可以添加一个{$define}
语句,但如果能够自动执行它会很好。
是否可以像这样创建条件定义:
{$if typeof(TNode) = record}
type PNode = ^TNode;
{$else}
type PNode = TNode;
{$end}
我为什么要这个?
我在使用class
和record
针对特定问题之间交替使用。
出于速度原因,我想使用记录,但也想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”仅确保它被声明,而不是它是范围内的“最接近”。
我认为这涵盖了大多数情况。