我想在Rust中编写这个C代码:
LIBS += -LPath_To_UxTheme -lUxTheme
我可以创建一个返回#include <limits.h>
#if ((INT_MAX >> 15) >> 15) >= 1
#define LUAI_BITSINT 32
#else
/* 'int' always must have at least 16 bits */
#define LUAI_BITSINT 16
#endif
的函数,但我希望避免运行时成本。我不知道如何在Rust中的宏中表达BITSINT
,是否可能?
这将是我的运行时代码:
isize::max_value()
答案 0 :(得分:3)
目前,您无法根据函数调用定义const
或static
值。这需要const functions feature完成。
有人说......
但我想避免运行时成本
tl; dr 此处没有运行时费用,这很好。
为避免运行时成本,首先应确保具有运行时成本。为了检查,我使用了这段代码:
#[inline(never)]
fn bitsint() -> usize {
if ((isize::max_value() >> 15) >> 15) >= 1 {
12345
} else {
67890
}
}
fn main() {
println!("{}", bitsint());
}
我切换了值以便在程序集中更容易找到它们。生成的程序集没有函数bitsint
,即使我要求它没有内联。停止优化编译器很难!
在程序集的其余部分中,即使67890
执行,也不会发生值12345
。
另一种解决方案可能是使用条件编译。作为一个未经考验的例子:
#[cfg(target_pointer_width = "64")]
const LUAI_BITSINT: usize = 32;
#[cfg(not(target_pointer_width = "64"))]
const LUAI_BITSINT: usize = 16;
您还可以使用构建脚本根据您想要的任何条件生成Rust代码。这将创建一个常量,然后您可以include!
进入代码。