我可以在编译器指令中推断类型的类型吗
Can I deduce the type of a type in a compiler directive
是否可以像这样创建条件定义:
{$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" 只确保它被声明,而不是它是范围内的 "closest"。
我认为这涵盖了大多数情况。
是否可以像这样创建条件定义:
{$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" 只确保它被声明,而不是它是范围内的 "closest"。
我认为这涵盖了大多数情况。