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

Update:

推荐答案

你肯定能做到,至少在函数内部:

cnst.rs:

#[no_mangle]
pub static X: i32 = 42;

cnstuse.c:

#include <stdint.h>
#include <stdio.h>

extern const int32_t X;

int main() {
    char data[X];
    printf("%lu\n", sizeof(data));
    return 0;
}

汇编:

% rustc --crate-type=staticlib cnst.rs
note: link against the following native artifacts when linking against this static library
note: the order and any duplication can be significant on some platforms, and so may need to be preserved
note: library: System
note: library: pthread
note: library: c
note: library: m
% gcc -o cnstuse cnstuse.c libcnst.a
% ./cnstuse
42

然而,顶级数组声明不能使用全局变量/常量来表示大小,因此这只能在函数内部工作.

Rust相关问答推荐

交叉术语未正确清除屏幕

在函数内定义impl和在函数外定义impl的区别

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

如何获取Serde struct 的默认实例

无法定义名为&new&的关联函数,该函数的第一个参数不是self

如何正确重新排列代码以绕过铁 rust 借入判断器?

如何将实现多个特征的 struct 传递给接受这些特征为&;mut?

Rust proc_macro 和 syn:解析空格

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

Rust中的位移操作对范围有什么影响?

在 Rust 中,Weak 如何知道内部值何时被删除?

为什么基于 clap::Parser 读取的大量数字进行计算比硬编码该数字时慢?

在 Rust 中返回对枚举变体的引用是个好主意吗?

以下打印数组每个元素的 Rust 代码有什么问题?

为什么这个闭包没有比 var 长寿?

为什么我可以从读取的可变自引用中移出?

为什么这里需要类型注解?

在 macro_rules 中转义 $ 美元符号

守卫如何影响匹配语句?

如何在 Rust 中使用特征标志来捕获多行代码?