如何编写 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;
因为它是内联的并且只使用内部函数(和编译器指令),所以该函数将在编译时解析为常量而不生成任何代码。
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;
因为它是内联的并且只使用内部函数(和编译器指令),所以该函数将在编译时解析为常量而不生成任何代码。