mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-07 04:23:30 +00:00
explain how to turn integers into fn ptrs
(with an intermediate raw ptr, not a direct transmute)
This commit is contained in:
parent
09ea21343a
commit
cec6dfcd67
@ -930,6 +930,9 @@ extern "rust-intrinsic" {
|
||||
/// fn foo() -> i32 {
|
||||
/// 0
|
||||
/// }
|
||||
/// // Crucially, we `as`-cast to a raw pointer before `transmute`ing to a function pointer.
|
||||
/// // This avoids an integer-to-pointer `transmute`, which can be problematic.
|
||||
/// // Transmuting between raw pointers and function pointers (i.e., two pointer types) is fine.
|
||||
/// let pointer = foo as *const ();
|
||||
/// let function = unsafe {
|
||||
/// std::mem::transmute::<*const (), fn() -> i32>(pointer)
|
||||
|
@ -1338,6 +1338,32 @@ mod prim_ref {}
|
||||
/// is a reference to the function-specific ZST. `&bar` is basically never what you
|
||||
/// want when `bar` is a function.
|
||||
///
|
||||
/// ### Casting to and from integers
|
||||
///
|
||||
/// You cast function pointers directly to integers:
|
||||
///
|
||||
/// ```rust
|
||||
/// let fnptr: fn(i32) -> i32 = |x| x+2;
|
||||
/// let fnptr_addr = fnptr as usize;
|
||||
/// ```
|
||||
///
|
||||
/// However, a direct cast back is not possible. You need to use `transmute`:
|
||||
///
|
||||
/// ```rust
|
||||
/// # let fnptr: fn(i32) -> i32 = |x| x+2;
|
||||
/// # let fnptr_addr = fnptr as usize;
|
||||
/// let fnptr = fnptr_addr as *const ();
|
||||
/// let fnptr: fn(i32) -> i32 = unsafe { std::mem::transmute(fnptr) };
|
||||
/// assert_eq!(fnptr(40), 42);
|
||||
/// ```
|
||||
///
|
||||
/// Crucially, we `as`-cast to a raw pointer before `transmute`ing to a function pointer.
|
||||
/// This avoids an integer-to-pointer `transmute`, which can be problematic.
|
||||
/// Transmuting between raw pointers and function pointers (i.e., two pointer types) is fine.
|
||||
///
|
||||
/// Note that all of this is not portable to platforms where function pointers and data pointers
|
||||
/// have different sizes.
|
||||
///
|
||||
/// ### Traits
|
||||
///
|
||||
/// Function pointers implement the following traits:
|
||||
|
Loading…
Reference in New Issue
Block a user