Rust вызывает C, статический const в C-коде

Я использовал rust-bindgen для генерации кода интерфейса ржавчины.

Теперь в коде 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 регулярно используется среди других симуляций 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);

В ржавчине это выглядит так:

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, найдено enum Struct_mps_key_s)

Я не хороший программист C, и я даже не понимаю, откуда эти статические C получают от них значения.

Спасибо за вашу помощь.

Редактировать:

Обновление основано на ответе Криса Моргана.

Я добавил этот код (обратите внимание, я заменил * const mps_key_s на mps_key_t):

pub static MPS_KEY_ARGS_END: mps_key_t = &_mps_key_ARGS_END;

Просто для дополнительной информации о том, почему я использую mps_key_tв С:

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

1 ответ

#define MPS_KEY_ARGS_END (&_mps_key_ARGS_END)

& часть указывает, что он принимает указатель на объект, что тип MPS_KEY_ARGS_END будет mps_key_s const*, В Rust это *const mps_key_s (необработанный указатель), и может быть достигнуто так же, как в C, &_mps_key_ARGS_END, Вы можете определить MPS_KEY_ARGS_END таким образом, что вы можете использовать удобно, как это:

static MPS_KEY_ARGS_END: *const mps_key_s = &_mps_key_ARGS_END;
Другие вопросы по тегам