2016-11-23 96 views
-1

我想在Rust中使用C常量。下面是C代码的一部分:如何在Rust中访问C常量?

#define INT_CANCEL 2 

在走,我可以做这样的事情:

return C.INT_CANCEL 

我会怎么做鲁斯特类似的东西?

我已经试过类似

#[link(name = "name_of_lib")] 
extern { 
    int INT_CANCEL 
} 

但是,这并不编译。

+7

这不是一个常量,而是一个预处理宏。 C不具有_enum-constants_以外的符号常量。 – Olaf

回答

4

我不是Gopher,但不明白C #define s要么。相反,cgo does(至少some subsets of them)。

最好和最简单的选项是将值复制到您的程序。请注意,您必须定义一个大小

const INT_CANCEL: u8 = 2; 

您还可以创建一个宏,如果你真的需要能够等待类型在运行时决定的,但是这并不常见。

您还可以创建a build scriptcompiles some C code,其中包括报头,并打印出相应的防锈代码:

#include <stdio.h> 
#include "myheader.h" 

int main(int argc, char *argv[]) { 
    printf("const INT_CANCEL: u8 = %d;\n", INT_CANCEL); 

    return 0; 
} 

锈代码可以被包含回你的项目。


你也可以尝试修改rust-bindgen,这样做类似的东西CGO并尝试自动创建这些常量。

+0

谢谢你的回答。 “最好和最简单的选择是将价值复制到您的程序中。”这就是我想的,我想确保我没有失去任何东西。 –