如何编写Delphi编译时函数

如何编写Delphi编译时函数,delphi,compile-time,Delphi,Compile Time,Delphi-我可以为const和var声明编写自己的编译时函数,在编译时可执行 标准Delphi库包含Ord()、Chr()、Trunc()、Round()、High()等例程,用于常量初始化 我可以自己编写,在编译时执行例程,并将结果用作常量吗 我可以自己编写,在编译时执行例程,并将结果用作常量吗 不,你不能。这些函数内置于编译器中,if不提供任何扩展机制来允许第三方提供内置函数。您不能编写自己的内在函数。因为这需要编译器的魔力。 然而,可能还有其他的选择来实现你的目标 预处理器 唯一的方法

Delphi-我可以为const和var声明编写自己的
编译时函数
,在编译时可执行

标准Delphi库包含Ord()、Chr()、Trunc()、Round()、High()等例程,用于常量初始化

我可以自己编写,在编译时执行例程,并将结果用作常量吗

我可以自己编写,在编译时执行例程,并将结果用作常量吗


不,你不能。这些函数内置于编译器中,if不提供任何扩展机制来允许第三方提供内置函数。

您不能编写自己的内在函数。因为这需要编译器的魔力。
然而,可能还有其他的选择来实现你的目标

预处理器
唯一的方法是使用预处理器。
有几种:

Delphi预处理器

安德烈亚斯·豪斯拉登(Andreas Hausladen)刚刚公开了他自己在这方面的工作。
它不是一个真正的预处理器,而是一个语言扩展器。

预处理器的问题在于,它破坏了原始(预处理之前)源代码与Delphi编译的源代码之间的链接。
这意味着您将没有原始源的调试信息。
(除非重写映射文件)

内联
根据您想要做什么,您可以使用内联实现与内在函数几乎相同的效率。 见:

使用内在函数构造语句
如果您有一个由内在函数组成的代码块,那么完整的结果将在编译时进行计算,使整个构造像内在函数一样工作

请注意以下(愚蠢的)示例:

函数FitsInRegister:布尔值;内联;
开始
如果[tkString,tkUString]中的GetTypeKind(T),则结果:=false
其他的
{$IFDEF CPU32BITS}

结果:=SizeOf(T)No。您需要一个预处理器。也许问题应该是如何编写自定义preprocessor@Jasper问题很清楚。是否支持外部内置?
function FitsInRegister<T>: Boolean; inline;
begin
  if GetTypeKind(T) in [tkString, tkUString] then result:= false
  else 
  {$IFDEF CPU32BITS}
  Result:= SizeOf(T) <= 4;
  {$ELSEIF CPU64BITS}
  Result:= SizeOf(T) <= 8;
  {$ENDIF}
end;