gpt4 book ai didi

delphi - 如何编写Delphi编译时函数

转载 作者:行者123 更新时间:2023-12-03 15:06:06 25 4
gpt4 key购买 nike

Delphi - 我可以为 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 编译的源代码之间的链接。
这意味着您将没有原始源代码的调试信息。
(除非您重写 map 文件)

内联
根据您想要执行的操作,您可以使用内联来实现与内部函数几乎相同的效率。请参阅: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;

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

关于delphi - 如何编写Delphi编译时函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32141319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com