如何编写Delphi编译时函数

YN

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

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

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

约翰

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

预处理器
唯一的方法是使用预处理器。
有几个: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;

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章