0

我已经使用 rust-bindgen 来生成 rust 接口代码。

现在在 C 代码中,您可以找到以下内容:

extern const struct mps_key_s _mps_key_ARGS_END;
#define MPS_KEY_ARGS_END (&_mps_key_ARGS_END)

请注意,在孔中其余代码_mps_key_ARGS_END不会再次出现。

宏 MPS_KEY_ARGS_END 经常在其他 simular中使用mps_key_s

现在 rust-bindgen 生成的代码是这样的:

pub static _mps_key_ARGS_END: Struct_mps_key_s;

现在在 C 代码中,这是一个示例用法:

extern void _mps_args_set_key(mps_arg_s args[MPS_ARGS_MAX], unsigned i,
                              mps_key_t key);

_mps_args_set_key(args, 0, MPS_KEY_ARGS_END);

在 rust 中,它看起来像这样:

pub fn _mps_args_set_key(args: [mps_arg_s, ..32u], i: ::libc::c_uint,
                         key: mps_key_t);

现在我试着这样称呼它:

_mps_args_set_key(args, 0 as u32, _mps_key_ARGS_END );

但我得到一个错误:

错误:不匹配的类型:预期*const Struct_mps_key_s,找到 Struct_mps_key_s(预期 *-ptr,找到枚举 Struct_mps_key_s)

我不是一个优秀的 C 程序员,我什至不明白这些 C 静态甚至从哪里获得值。

谢谢你的帮助。

编辑:

根据 Chris Morgan 的回答进行更新。

我添加了这段代码(注意,我用 mps_key_t 替换了 *const mps_key_s):

pub static MPS_KEY_ARGS_END: mps_key_t = &_mps_key_ARGS_END;

只是关于我为什么mps_key_t在 C 中使用 , 的一些额外信息:

typedef const struct mps_key_s *mps_key_t;

生锈:

pub type mps_key_t = *const Struct_mps_key_s;

这个接缝接缝比以前更好,但现在我遇到了严重的崩溃:

错误:内部编译器错误:意外失败注意:编译器遇到了意外的失败路径。这是一个错误。注意:我们将不胜感激错误报告: http ://doc.rust-lang.org/complement-bugreport.html注意:运行 RUST_BACKTRACE=1回溯任务“rustc”在“预期项目”失败,发现外部项目_mps_key_ARGS_END::_mps_key_ARGS_END (id=1102)', /home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libsyntax/ast_map/mod.rs:327

4

1 回答 1

1
#define MPS_KEY_ARGS_END (&_mps_key_ARGS_END)

The & part indicates that it is taking a pointer to the object, that the type of MPS_KEY_ARGS_END will be mps_key_s const*. In Rust, that is *const mps_key_s (a raw pointer), and can be achieved in the same way as in C, &_mps_key_ARGS_END. You can define MPS_KEY_ARGS_END in a way that you can use conveniently like this:

static MPS_KEY_ARGS_END: *const mps_key_s = &_mps_key_ARGS_END;
于 2014-10-27T03:24:54.323 回答