Lua中的仅调试范式

本文关键字:调试 范式 Lua | 更新日期: 2023-09-27 18:20:00

在C/C++中,我们有

#ifdef _DEBUG 
    ... 
#endif

在C#中,我们有

#if DEBUG 
    ... 
#endif 

[Conditional("DEBUG")]

我不希望有什么像基于属性的方式来处理仅调试代码那样花哨的东西,但我想知道是否有一种明显的常量类型的东西,或者任何其他方式可以使代码仅出现在调试构建中。例如,我现在正在Lua做以下事情:

if not type(parameters.callback) == 'function' then
    error('The "callback" parameter is not a function, or missing (nil).');
end
if not type(parameters.times) == 'number' then
    error('The "times" parameter is not a number or missing (nil).');
end
if not type(parameters.interval) == 'number' or not parameters.interval == nil then
    error('The "interval" parameter is not a number.');
end

我甚至不知道它是否会运行。这门语言完全陌生。

考虑到我正在编写的函数的性质,一个简单的retry函数需要进行多次尝试,一个可选的间隔和一个回调作为参数-我预计在整个应用程序编写过程中会多次使用-并且它将在微控制器上运行-我觉得这些检查不应该在生产版本中进行,因为我猜它们可能相对昂贵?!?!我甚至在for循环中进行类型检查。

该语言中是否已经内置了允许条件编译的内容?或者有人想出一个干净整洁的方法来处理这类事情吗?我知道我可以声明一个全局变量,将其标记为调试构建,并简单地围绕上面的内容放置and if块,但我想我会问的。

谷歌搜索让我一无所获。事实上,当我读到关于Lua的网站时,我觉得自己又回到了90年代中后期的网络。

谢谢,李。

编辑

或者我只是把这个方法写成一个C模块?!?!

Lua中的仅调试范式

使代码只出现在调试构建中的方法

Lua没有"构建"。这是一种解释性语言。在内部,它被编译为字节码,但这是一个实现细节。

然而,如果您对构建步骤感到满意,那么您可以像C一样使用预编译器。事实上,你可以使用与你的C编译器相同的语法,这样你就得到了你已经熟悉的语法。

例如,我的MSVC旧副本使用cl /EP <filename>通过预处理器运行filename,并将输出转储到stdout。然后你可以写:

#ifdef _DEBUG 
    -- debug Lua code goes here
#endif

最干净的方法可能是类似的方法

_DEBUG = true
if _DEBUG then
    --code
end

所使用的Lua的风格是eLua或Embedded Lua,它确实允许将脚本预编译为字节码。

代码在GitHub上,所以如果时间允许,我会考虑提交一个补丁,允许真正的条件编译,因为它都是C代码。

这样每个人都会受益。无论原始问题中的检查是否昂贵,通常情况下,您希望代码输入或输出取决于您是否正在积极处理它或它是否在生产环境中使用,而不是相反。

由于它们支持预编译,并且只针对具有不同性能和内存限制级别的嵌入式设备,如果它们还没有实现支持,我也不会感到惊讶。我会跳到那里,然后找到下一个。

谢谢大家。