'check pointer size at compile time
I found similar question Compile-time generic type size check, but it not received any answer.
The problem is in cooperation with other programming language via FFI + unsafe,
I want to be sure that mem::size_of::<*mut T>()
have suitable size.
I found such static_assert
macro in Internet:
macro_rules! static_assert {
(type $t:ty; ) => (
type __StaticAssert = $t;
);
(type $t:ty; $e:expr $(, $ee:expr)*) => (
static_assert!(type ($t, [i8; 0 - ((false == ($e)) as usize)]); $($ee),*);
);
($e:expr $(, $ee:expr)*) => (
static_assert!(type [i8; 0 - ((false == ($e)) as usize)]; $($ee),*);
);
}
static_assert!(2 == 2);
it works, but if I use mem::size_of::<*const f64>()
inside macro all fails,
because of: calls in constants are limited to struct and enum constructors
,
any idea how to calculate size_of
*const f64
at compile time?
Solution 1:[1]
For pointers there is a configuration flag that you can check. You could do this to force a compile-time error:
#[cfg(not(target_pointer_width = "64"))]
compile_error!("Your pointers are too small. Please try again with a more expensive computer.");
In general there is the "transmute trick": to assert the size of something at compile-time, transmute it to something which is known to have the correct size in a dead function. For instance:
#[allow(dead_code)]
fn _assert_pointers_are_64bits() {
unsafe {
::std::mem::transmute::<*const f64, [u8; 8]>(panic!());
}
}
These tricks will have to do until size_of
is made into a const fn.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Colonel Thirty Two |