CXX translate - const char * в эквивалент ржавчины

Пишу интеграцию C++ и Rust через CXX

https://cxx.rs/index.html

Сигнатура функции C++ в myclient.h

    public:
        bool connect(const char * host, int port, int clientId = 0);

Что мне добавить в main.rs, чтобы его можно было вызывать из ржавчины? Я пробовал много комбо

        fn connect(host: &mut , port: u64, clientId: u64 ) -> bool;
        fn connect(host: *char , port: u64, clientId: u64 ) -> bool;
        fn connect(host: *const char , port: u64, clientId: u64 ) -> bool;

все эти ошибки удалены ... не очень хорошо разбираюсь в C++ или Rust, поэтому ... просто надеюсь, что кто-то может указать мне, как преобразовать это ... спасибо!


  error[cxxbridge]: unsupported type: char
     ┌─ src/main.rs:15:33
     │
  15 │         fn connect(host: *const char , port: u64, clientId: u64 ) -> bool;
     │                                 ^^^^ unsupported type

РЕДАКТИРОВАТЬ :

Подойдя поближе... кажется, он жалуется на pointer argument requires that the function be marked unsafe

#[cxx::bridge(namespace = "com::enserio")]
mod ffi {

    unsafe extern "C++" {
        include!("twsapi_grpc_server/include/twsapi-client.h");
        include!("twsapi_grpc_server/include/AvailableAlgoParams.h");
        include!("twsapi_grpc_server/include/AccountSummaryTags.h");
        include!("twsapi_grpc_server/include/Utils.h");

        type TWSApiClient;

        fn new_twsapi_client() -> UniquePtr<TWSApiClient>;
        
        fn init_connect(&self, host: *const c_char , port: i32, client_id: i32) -> bool;
   }
}
error[cxxbridge]: pointer argument requires that the function be marked unsafe
     ┌─ src/main.rs:16:32
     │
  16 │         fn init_connect(&self, host: *const c_char , port: i32, client_id: i32) -> bool;
     │                                ^^^^^^^^^^^^^^^^^^^ pointer argument requires that the function be marked unsafe

Обычно символы, экспортированные с помощью extern "C", используются для вызова чего-либо из другого языка. Поскольку в вашем коде C++ есть public, функция там является членом. В C нет функций-членов.

Sergey Kolesnik 10.11.2022 23:41

@SergeyKolesnik Я обновил редактирование, чтобы указать дополнительную информацию.

Erik 12.11.2022 16:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

char в ржавчине это не то, что вам нужно (в ржавчине char — это символ юникода, а в C — один байт).

То, что вы хотите, это libc::c_char.

use libc::c_char;
extern "C" fn connect(host: *const c_char , port: u64, clientId: u64 ) -> bool {
    true
}

Однако я не уверен, что bool в качестве возвращаемого типа будет работать надежно, я бы, вероятно, вернул тип с конкретным размером, например u32.

libc::c_char на самом деле core::ffi::c_char, i8 на x86 (32, 64), поэтому const char* это *const i8 в Rust
Miiao 11.11.2022 15:18

Я вижу pointer argument requires that the function be marked unsafe .. хотя все это помечено как небезопасное .. обновлю пост

Erik 12.11.2022 16:41

установив значение «закрыто». Я успешно заработал с вашей помощью И добавил несколько других исправлений … например, добавление unsafe прямо к самому методу.

Erik 12.11.2022 19:51

Другие вопросы по теме