首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问Rust中的C联合值?

如何访问Rust中的C联合值?
EN

Stack Overflow用户
提问于 2017-04-16 18:03:54
回答 1查看 352关注 0票数 2

我试图从C库SDL_PollEvent调用函数SDL2。我知道已经有可用的包装,但我想创建自己的,只是为了学习。函数需要一个指向这个C联合的指针:

代码语言:javascript
复制
typedef union{
  Uint8 type;
  SDL_ActiveEvent active;
  SDL_KeyboardEvent key;
  SDL_MouseMotionEvent motion;
  SDL_MouseButtonEvent button;
  SDL_JoyAxisEvent jaxis;
  SDL_JoyBallEvent jball;
  SDL_JoyHatEvent jhat;
  SDL_JoyButtonEvent jbutton;
  SDL_ResizeEvent resize;
  SDL_ExposeEvent expose;
  SDL_QuitEvent quit;
  SDL_UserEvent user;
  SDL_SysWMEvent syswm;
} SDL_Event;

我导入的功能如下:

代码语言:javascript
复制
#[link(name = "SDL2")]
extern "C" {
    fn SDL_PollEvent(event: *mut SdlEvent) -> libc::c_int;
} 

并声明了如下类型:

代码语言:javascript
复制
type SdlEvent = [u8; 56];                                                    

现在,我可以调用SDL_Pollevent并检索联合的type值:

代码语言:javascript
复制
// According to sizeof(SDL_Event), the unit is 56 bytes
let mut sdl_event: SdlEvent = [0; 56];

unsafe { SDL_PollEvent(&mut sdl_event) };

let event_type: u32 = u32::from_be((sdl_event[0] as u32) << 24 | (sdl_event[1] as u32) << 16 |
                                   (sdl_event[2] as u32) << 8 |
                                   (sdl_event[3] as u32));

match event_type {                              
    0x100 => {
        Event {                     
             // 0x100 is SDL_QUIT -> quit application
     }
    }                                      
    0x200 => {
        Event { // SDL_KEYDOWN
             // How can I 
     }
    }                                      
}

这很好,但是现在我想知道按了哪个键,这意味着我需要检索SDL_KeyboardEvent类型的值SDL_KeyboardEvent。我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-16 18:16:08

联盟基本上与C完全一样,这意味着访问它们是不安全的。它们也是Rust 1.16的一个不稳定的特征:

代码语言:javascript
复制
#![feature(untagged_unions)]

extern crate libc;

// Definitions for SDL_ActiveEvent, SDL_KeyboardEvent, etc.

#[repr(C)]
union SDLEvent {
    typ: libc::uint8_t,
    active: SDL_ActiveEvent,
    key: SDL_KeyboardEvent,
    // All the rest
}

fn thing(event: SDLEvent) {
    unsafe { 
        println!("{}", event.typ);
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43440360

复制
相关文章

相似问题

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