Declaring array using a constant expression for its size

后端 未结 1 1054
无人及你
无人及你 2021-01-11 21:32

I have a newtype wrapper around an array. I assumed that I could use size_of instead of manually passing the size of the array around, but the compiler thinks I

相关标签:
1条回答
  • 2021-01-11 22:22

    Your SIZE definition is not legal; it’s just that the errors in it occur later than the error on the array construction. If you change [0u8, ..SIZE] to [0u8, ..6] just so that that part works, you find the problems with the SIZE declaration:

    <anon>:7:24: 7:53 error: function calls in constants are limited to struct and enum constructors [E0015]
    <anon>:7     const SIZE: uint = size_of::<BluetoothAddress>();
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    <anon>:7:24: 7:51 error: paths in constants may only refer to items without type parameters [E0013]
    <anon>:7     const SIZE: uint = size_of::<BluetoothAddress>();
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~
    

    You simply can’t call size_of like that at present.

    An alternative is to invert things so that SIZE is the canonical definition and the other places use it:

    use std::mem::{size_of, size_of_val};
    
    const SIZE: uint = 6;
    
    #[repr(C, packed)]
    struct BluetoothAddress([u8, ..SIZE]);
    
    fn main() {
        let bytes = [0u8, ..SIZE];
        println!("{} bytes", size_of_val(&bytes));
    }
    

    Update: With Rust 1.0, this question has been effectively obsoleted, and the compiler error messages have been improved so that they are even more clear.

    Furthermore, with #42859 recently landed, rustc nightly will allow using size_of in a constant context, provided the crate has #![feature(const_fn)] (and when #43017 lands, that won’t be needed any more either, and then it will filter through to stable).

    In other words, improvements to the language have made this no longer an issue.

    0 讨论(0)
提交回复
热议问题