首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Rust中解引用C/C++ void *到struct或callback?

如何在Rust中解引用C/C++ void *到struct或callback?
EN

Stack Overflow用户
提问于 2020-10-10 02:16:51
回答 1查看 294关注 0票数 1

我想为Rust中的一个老游戏写一个AI。这个游戏的AI是库,在它的Linux端口上它只是一个导出的.so文件:

代码语言:javascript
运行
复制
extern "C" void client(int Command, int Player, void *Data);

void *Data可以是结构体(取决于Command),也可以是以下函数:

代码语言:javascript
运行
复制
typedef int TServerCall(int Command, int Player, int Subject, void *Data);

在C++中,AI代码根据命令将其强制转换为已知大小或回调的结构,例如:

代码语言:javascript
运行
复制
typedef int __stdcall TServerCall(int Command, int Player, int Subject, void *Data);

或者到struct:

代码语言:javascript
运行
复制
// where G is a extern TNewGameData G;

G = *(TNewGameData *) Data;

然后,我可以访问G或其他结构或数组的字段。

问题:

如何将void *形式的数据转换为Rust中的结构或函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-11 17:44:07

你可以在Rust中使用原始指针。

代码语言:javascript
运行
复制
use libc::{c_void, c_int};

#[repr(C)]
struct TNewGameData {
    // the fields go here
}

#[no_mangle]
pub extern "C" fn client(command: c_int, player: c_int, data: *mut c_void) {
    // Cast raw pointer to the right type.
    let game_data_ptr = data as *mut TNewGameData;
    // Convert to Rust reference.
    let game_data = unsafe { &mut *data };
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64285303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档