repr - 目前接受C,C表示兼容C ABI。 #[repr(C)] enum eType { Operator, Indicator, } 对于struct类型,可以使用 repr - 目前只接受C和packed,C表示结构体兼容C ABI,packed表示移除字段间的padding。 ---
#[repr(Int)]enumMyEnum{A(u32),B(f32,u64),C{x:u32,y:u8},D,} 内存布局如下 #[repr(C)]unionMyEnumRepr{A:MyEnumVariantA,B:MyEnumVariantB,C:MyEnumVariantC,D:MyEnumVariantD,}#[repr(Int)]enumMyEnumTag{A,B,C,D}#[repr(C)]structMyEnumVariantA(MyEnumTag,u32);#[repr(C)]str...
在Rust中使用C语言的枚举可以通过使用`#[repr(C)]`属性来指定枚举的表示方式为C语言兼容的方式。这样可以确保Rust的枚举和C语言的枚举在内存中的布局是一致的。 下面是一个简单的示例,演示了如何在Rust中使用C语言的枚举: rust. #[repr(C)] enum MyCEnum {。
#[repr(C)]enumMyCEnum{Banana=0,Apple=5,Pineapple=7,} 复制 但与C不同的是,Rust 只保证明确写下的判别值。这样的枚举可以安全地转换为整数类型(比如MyCEnum::Apple as u32),反之则不然:编译器总是假设MyCEnum 的底层值是0、5或7,违反这个约束是未定义行为(UB)。如果我们想要求一个枚举是一个精确的...
这类 enum 表示成一个整数,与 C 语言的枚举对应。定义时可以指定表示成哪个整数类型,例如 repr (i32...
}#[repr(u8)]enumMyReprOption<T> {Some(T),None, }assert_eq!(8, size_of::<MyOption<&u16>>());assert_eq!(16, size_of::<MyReprOption<&u16>>()); 空指针优化针对无字段且拥有repr(u*)、repr(i*)或repr(C)的枚举仍然生效。
C代码: 复制 typedef struct { uint8_tstatus;}User;User*create_user(uint8_tstatus); 1. 2. 3. 4. 5. 你可以写一个Rust枚举来表示状态: 复制 #[repr(u8)]#[derive(Debug, PartialEq)]pubenumUserStatus { Active=0,Inactive,Suspended,Deleted,} ...
-C lto,相当于Clang的-flto。 -C force-frame-pointers,相当于Clang的-fno-omit-frame-pointer。 -D warnings大致等同于-Werror。 其他有趣的标志可以在rustc -C帮助下找到,在夜间,...
自定义枚举类enum的内存布局一般与枚举类分辨因子discriminant的内存布局一致。更复杂的情况,请见下文章节。 预置内存布局方案 编译器内置了四款内存布局方案,分别是 默认Rust内存布局 — 没有元属性注释 C内存布局#[repr(C)] 数字类型·内存布局#[repr(u8 / u16 / u32 / u64 / u128 / usize / i8 / i16...
我们知道,Rust中,可以对结构体(或 enum 等)添加方法。这是属于面向对象的特性,而纯C是不支持这种特性的。于是,我们必须将这些方法单独实现为一批函数,在这批函数名前面加上统一的前缀,看下面代码: rust 代码 // rust #[repr(C)] struct Foo{ a:isize, ...