如何编写 Delphi 的编译时函数

6

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

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

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


1
不行,你需要一个预处理器。 - TLama
也许问题应该是如何编写自定义预处理器。 - Jasper Schellingerhout
1
@Jasper 这个问题很明确。外部内置是否被支持? - David Heffernan
2个回答

9
您不能编写自己的内在函数。因为那需要编译器魔法。然而,可能有其他选项来实现您的目标。
预处理器 唯一的方法是使用预处理器。 有几个: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://dev59.com/MljUa4cB1Zd3GeqPQ2bu#6401833

使用内置函数构建语句
如果您有一个由内置函数组成的代码块,则完整结果将在编译时计算,使得整个结构就像内置函数一样工作。

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

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;

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

4

我能自己编写代码,在编译时执行常规操作并将结果用作常量吗?

不可以。这些函数内置于编译器中,它没有扩展机制允许第三方提供内置函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接