如何编写Delphi编译时函数

时间:2015-08-21 13:17:26

标签: delphi compile-time

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

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

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

2 个答案:

答案 0 :(得分:7)

你无法编写自己的内在函数。因为这需要编译魔术 但是,可能还有其他选择来实现您的目标。

<强>预处理
唯一的方法是使用预处理器 有几个: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编译的源代码之间的链接。
这意味着您将无法获得原始来源的调试信息 (除非您重写地图文件)

<强>内联
根据您的想法,您可以使用内联来实现与内在函数几乎相同的效率。 请参阅:https://stackoverflow.com/a/6401833/650492

使用内在函数构建语句
如果你有一个由内部函数组成的代码块,那么将在编译时评估完整的结果,使得总体结构就像它是一个内部函数一样工作。

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

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;

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

答案 1 :(得分:4)

  

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

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