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;