防锈剂/静电剂能否暴露在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

假设我有一个包含常量或静态变量的Rust API,例如i32。我想使用C中的这个Rust API。从C方面来说,我想使用这个常量作为数组大小。我没有办法这样做,对吗?在为Rust API的其余部分提供声明的C头文件中重新声明常量的最佳解决方案是什么

更新:
更具体地说,我使用的是不支持可变长度数组(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++不同,它没有积分常数( INTRONXX/COD>),因此,根据编译的模式(C或C++),可能会受到限制。 rustc或Cargo中没有自动生成C文件的工具,符号仅在链接时导出并可用,而不是在编译时


不过你很幸运,有一个解决方案,尽管它稍微麻烦一些

Rust具有一个
build.rs
文件,该文件作为常规编译过程的一部分进行编译和执行。此文件可以包含生成其他文件的命令,因此完全可以:

  • .rs
    文件中一次性记录常量
  • 通过
    build.rs
    文件以C格式生成一个C标题“导出”此常量

  • 啊,这对支持可变长度数组的编译器来说很好,但对我的编译器就不行了。我使用Visual C++ 2005编译器。我将更新我的问题,使其更加具体。在这种情况下,您将不得不使用基于预处理器的常量,因此很遗憾,您将无法使用在Rust端定义的常量。如何在不初始化的情况下为C声明
    X
    ?我将不得不和build.rs混在一起。我已经看过了,但是忽略了它,我倾向于得到尽可能简单的概念证明。