我发现了类似的问题Compile-time generic type size check,但未收到任何答案。
问题是通过FFI +不安全与其他编程语言合作,
我想确保mem::size_of::<*mut T>()
具有合适的大小。
我在互联网上找到了这样的static_assert
宏:
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);
它有效,但如果我在宏内部使用mem::size_of::<*const f64>()
全部失败,
因为:calls in constants are limited to struct and enum constructors
,
任何想法如何在编译时计算size_of
*const f64
?
答案 0 :(得分:2)
对于指针,您可以检查配置标志。您可以这样做以强制编译时错误:
#[cfg(not(target_pointer_width = "64"))]
const ERROR: () = "Your pointers are too small. Please try again with a more expensive computer.";
一般情况下,有转换技巧&#34;:在编译时断言某事物的大小,将其转换为已知在死函数中具有正确大小的东西。例如:
#[allow(dead_code)]
fn _assert_pointers_are_64bits() {
unsafe {
::std::mem::transmute::<*const f64, [u8; 8]>(panic!());
}
}
这些技巧必须要做,直到size_of
成为const fn。