防锈剂/静电剂能否暴露在C中?
假设我有一个包含常量或静态变量的Rust API,例如i32。我想使用C中的这个Rust API。从C方面来说,我想使用这个常量作为数组大小。我没有办法这样做,对吗?在为Rust API的其余部分提供声明的C头文件中重新声明常量的最佳解决方案是什么 更新:防锈剂/静电剂能否暴露在C中?,c,rust,ffi,C,Rust,Ffi,假设我有一个包含常量或静态变量的Rust API,例如i32。我想使用C中的这个Rust API。从C方面来说,我想使用这个常量作为数组大小。我没有办法这样做,对吗?在为Rust API的其余部分提供声明的C头文件中重新声明常量的最佳解决方案是什么 更新: 更具体地说,我使用的是不支持可变长度数组(Visual C++ 2005)的编译器,你可以做到,至少在函数里面: cnst.rs: #[无损坏] pub static X:i32=42; cnstuse.c: #包括 #包括 外部常量int
更具体地说,我使用的是不支持可变长度数组(Visual C++ 2005)的编译器,你可以做到,至少在函数里面:
cnst.rs
:
#[无损坏]
pub static X:i32=42;
cnstuse.c
:
#包括
#包括
外部常量int32_t X;
int main(){
字符数据[X];
printf(“%lu\n”,sizeof(data));
返回0;
}
汇编:
%rustc——板条箱类型=staticlib cnst.rs
注意:当链接到此静态库时,链接到以下本机工件
注意:在某些平台上,顺序和任何重复可能很重要,因此可能需要保留
注:图书馆:系统
注意:库:pthread
注:图书馆:c
注:图书馆:m
%gcc-o cnstuse cnstuse.c libcnst.a
%/cnstuse
42
但是,顶级数组声明不能使用全局变量/常量来表示大小,因此这只能在函数内部工作
更具体地说,我使用的是不支持可变长度数组(Visual C++ 2005)< /P>的编译器。
这需要在使用点定义(而不仅仅是声明)常量。此外,C比C++更大的限制,即构成数组维数的常数:基本上是整数字(可以通过宏替换)和枚举数;与C++不同,它没有积分常数(
不过你很幸运,有一个解决方案,尽管它稍微麻烦一些 Rust具有一个
build.rs
文件,该文件作为常规编译过程的一部分进行编译和执行。此文件可以包含生成其他文件的命令,因此完全可以:
.rs
文件中一次性记录常量build.rs
文件以C格式生成一个C标题“导出”此常量啊,这对支持可变长度数组的编译器来说很好,但对我的编译器就不行了。我使用Visual C++ 2005编译器。我将更新我的问题,使其更加具体。在这种情况下,您将不得不使用基于预处理器的常量,因此很遗憾,您将无法使用在Rust端定义的常量。如何在不初始化的情况下为C声明
X
?我将不得不和build.rs混在一起。我已经看过了,但是忽略了它,我倾向于得到尽可能简单的概念证明。