Given a struct:
#[repr(C)]
pub struct User {
pub name: *const c_char,
pub age: u8,
pub ctx: ??,
}
the field ctx
would only be manipulated by C code; it's a pointer to a C struct UserAttr
.
According to the Rust FFI documentation, the choice would be defined as an opaque type pub enum UserAttr {}
. However, I found that Rust is unable to copy its value, e.g. why does the address of an object change across methods.
What's the right way in Rust to define such an opaque pointer, so that its value (as a pointer) gets copied across methods?
The future
RFC 1861 introduced the concept of an extern type. While implemented, it is not yet stabilized. Once it is, it will become the preferred implementation:
Today
The documentation states:
An opaque pointer is created such that there's no normal way of creating such a type; you can only create pointers to it.
Breaking it down a bit:
Thus it's an opaque pointer. Moving the struct
MyRustType
will not change the value of the pointer.The past
Previous iterations of this answer and the documentation suggested using an empty enum (
enum MyTypeFromC {}
). An enum with no variants is semantically equivalent to the never type (!
), which is a type that cannot exist. There were concerns that using such a construct could lead to undefined behavior, so moving to an empty array was deemed safer.