如何编写 Delphi 编译时函数

How to write Delphi compile-time functions

Delphi - 我可以为 const 和 var 声明编写自己的 compile-time functions,并在编译时执行。

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

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

Can I write my own, to execute routine at compile-time and use the result as constant?

不,你不能。这些函数内置于编译器中,如果不提供扩展机制以允许第三方提供内置函数。

您不能编写自己的内部函数。因为这需要编译器魔法。
但是,可能还有其他选择可以实现您的目标。

预处理器
唯一的方法是使用预处理器。
有几个:http://wiki.delphi-jedi.org/wiki/JEDI_Pre_Processor

Delphi预处理器 http://sourceforge.net/p/dpp32/wiki/Home/history

Andreas Hausladen 刚刚开源了他自己在这方面的工作。
它不是真正的预处理器,而是语言扩展器。
https://github.com/ahausladen/DLangExtensions

预处理器的问题在于它会破坏原始(预处理之前)源代码和 Delphi 编译的源代码之间的 link。
这意味着您将没有原始源的调试信息。
(除非你重写地图文件).

内联
根据您想要执行的操作,您可以使用内联来实现与内部函数几乎相同的效率。 参见:

使用内部函数构造语句
如果你有一个由内部函数组成的代码块,完整的结果将在编译时进行评估,使整个结构像内部函数一样工作。

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

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;

因为它是内联的并且只使用内部函数(和编译器指令),所以该函数将在编译时解析为常量而不生成任何代码。