在编译时检查指针大小

时间:2016-08-18 16:16:00

标签: rust

我发现了类似的问题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

1 个答案:

答案 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。