Атрибут #[repr] у enum
Атрибут #[repr] у enum задаёт способ размещения перечисления в памяти.
По умолчанию Rust сам выбирает внутреннее представление, но иногда нужно
зафиксировать его явно - например, для совместимости с C, для работы с
дискриминантами или для точного контроля размера. Атрибут применяется
к объявлению enum и принимает один из вариантов представления:
repr(u8), repr(i32), repr(C), repr(usize) и другие.
Синтаксис
#[repr(представление)]
enum Имя
{
Вариант1,
Вариант2,
}
Пример
Зададим перечислению представление repr(u8) и
приведём вариант к числу:
#[repr(u8)]
enum Status
{
Active,
Inactive,
Pending,
}
fn main()
{
let res = Status::Inactive as u8;
println!("{}", res);
}
Результат выполнения кода:
1
Пример
Можно задать явные значения дискриминантов внутри
перечисления с repr(i32):
#[repr(i32)]
enum Code
{
Ok = 200,
NotFound = 404,
Error = 500,
}
fn main()
{
let res = Code::NotFound as i32;
println!("{}", res);
}
Результат выполнения кода:
404
Пример
Представление repr(C) удобно для совместимости
с C и для перечислений с полями:
#[repr(C)]
enum Value
{
Int(i32),
Float(f64),
}
fn main()
{
let res = std::mem::size_of::<Value>();
println!("{}", res);
}
Результат выполнения кода:
16
Смотрите также
-
перечисление
enum,
которое хранит одно значение из нескольких вариантов -
атрибут
discriminant,
который задаёт числовое значение варианта перечисления -
вариант
tuple-variant,
который хранит данные в виде кортежа -
вариант
struct-variant,
который хранит данные в виде структуры