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