基于函数调用的条件const定义

时间:2017-04-11 13:55:53

标签: rust

我想在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()

1 个答案:

答案 0 :(得分:3)

目前,您无法根据函数调用定义conststatic值。这需要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!进入代码。