DB 구조체의 크기와 복잡성을 감안할 때, 모든 것을 녹에 노출시키는 "깨끗한"방법은 아닙니다. C2HS과 유사한 도구를 사용하면 C 헤더에서 FFI를 생성 할 수 있지만 좋지 않을 것입니다.
녹 음 FFI는 현재 C++ 라이브러리를 호출 할 수 없으므로 대신 C API를 사용해야합니다.
저는 DB API에 익숙하지 않지만 DB 구조체의 인스턴스를 실제로 생성하기 위해 C에서 작은 지원 라이브러리를 만든 다음 getter 및 setter를 통해 struct __db
의 공용 멤버를 노출하는 것이 그럴듯한 것으로 보입니다 기능.
귀하의 구현은 다음과 같이 표시 될 수 있습니다
[#link_args = "-lrust_dbhelper"]
extern {
fn create_DB() -> *c_void;
fn free_DB(db: *c_void);
}
struct DB {
priv db: *c_void
}
impl Drop for DB {
fn drop(&self) {
free_DB(self.db);
}
}
priv struct DBAppMembers {
pgsize: u32,
priority: DBCachePriority
// Additional members omitted for brevity
}
impl DB {
pub fn new() -> DB {
DB {
db: create_DB()
}
}
pub fn set_pgsize(&mut self, u32 pgsize) {
unsafe {
let x: *mut DBAppMembers = ::std::ptr::transmute(self.db);
x.pgsize = pgsize;
}
}
// Additional methods omitted for brevity
}
특별히 매개 변수로 DB.db
멤버 C 함수를 호출하여 일부 추가 작업에서 자신을 저장할 수 있지만이 안전하지 않은 상황에서 작업을 요구하는 가능하다면 피해야한다. 그렇지 않은 경우 libdb
으로 내 보낸 각 함수는 고유 한 struct DB
에 자체 래퍼가 있어야합니다.
C 라이브러리에 바인딩 할 때 많은 양 (전부는 아님)을 제거하는 [rust-bindgen] (https://github.com/crabtw/rust-bindgen)이 있습니다. – huon