【发布时间】:2019-11-18 01:06:43
【问题描述】:
我正在将一个静态库移植到 Rust,它将与一个提供全局数组的 C 应用程序链接。下面是结构体和数组的定义:
typedef struct glkunix_argumentlist_struct {
char *name;
int argtype;
char *desc;
} glkunix_argumentlist_t;
extern glkunix_argumentlist_t glkunix_arguments[];
没有长度参数,而是数组中的最后一个条目将是{NULL, 0, NULL} (example),您可以在遍历数组时对其进行测试。
我认为这是结构的正确 Rust 表示:
#[repr(C)]
struct GlkUnixArgument {
name: *const c_char,
argtype: c_int,
desc: *const c_char,
}
Rust Nomicon shows how to define an extern for a single integer.
我已经看到如果你有一个长度参数you can use std::slice::from_raw_parts to get a slice,但我们还没有长度。我可以修改 C 代码以提供一个,但如果可以的话,我希望能够提供一个替代品。
我还没有看到如何从外部创建一个单一的 Rust 结构。虽然我确实只是想到了长度为 1 的 std::slice::from_raw_parts。
有没有更好的方法在 Rust 中更直接地定义外部结构?
【问题讨论】:
-
@PitaJ 但是在访问结构字段之前我是否需要使用
from_raw_parts之类的东西(显然这将是一个不同的函数)? -
“没有长度参数”一个 C 数组总是有一个长度,如果不是,它就不是一个定义的数组。你可以通过
const size_t len = sizeof glkunix_arguments / sizeof *glkunix_arguments; -
@Stargateur 我的意思是没有为函数提供长度参数。我可以更改最终用户代码,但它不会是替代品。
-
@Stargateur 我从来没有说过它没有长度。我说没有长度参数,我的意思是它没有暴露为一个全局变量,我可以简单地使用 Rust 的外部访问,也没有将它提供给库的函数。