#[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...
repr - 目前接受C,C表示兼容C ABI。 #[repr(C)] enum eType { Operator, Indicator, } 对于struct类型,可以使用 repr - 目前只接受C和packed,C表示结构体兼容C ABI,packed表示移除字段间的padding。 ---
既然此处我们是要研究与C的对应关系,其实真正Rust要导出共享库给C使用的场景,涉及到的枚举(基本)都是 Fieldless Enum。所以我们这里只限于说明 Fieldless Enum 到 C 枚举布局上的一些细节。 Rust 的枚举上,可以标注其内存布局,像下面这样: 代码语言:javascript 代码运行次数:0 复制 Cloud Studio代码运行 #[repr(C...
如果枚举有字段,其效果类似于repr(C)的效果,因为该类型有一个定义的布局。这使得将枚举传递给 C 代码或者访问该类型的原始表示并直接操作其标记和字段成为可能,详见RFC。 这些“repr”对结构(struct)没有作用。 在含有字段的枚举中加入明确的repr(u*)、repr(i*)或repr(C)可以抑制空指针优化,比如: enumMyOption...
-C link-arg,等同于Clang的-T。 -C opt-level,相当于Clang的-O(我们主要使用-C opt-level=z来嵌入)。 -C lto,相当于Clang的-flto。 -C force-frame-pointers,相当于Clang的-fno-omit-frame-pointer。 -D warnings大致等同于-Werror。 其他有趣的标志可以在rustc -C帮助下找到,在夜间,可以在rustc -...
这类 enum 表示成一个整数,与 C 语言的枚举对应。定义时可以指定表示成哪个整数类型,例如 repr (i32...
在Rust中使用C语言的枚举可以通过使用`#[repr(C)]`属性来指定枚举的表示方式为C语言兼容的方式。这样可以确保Rust的枚举和C语言的枚举在内存中的布局是一致的。 下面是一个简单的示例,演示了如何在Rust中使用C语言的枚举: rust. #[repr(C)] enum MyCEnum {。
我们知道,Rust中,可以对结构体(或 enum 等)添加方法。这是属于面向对象的特性,而纯C是不支持这种特性的。于是,我们必须将这些方法单独实现为一批函数,在这批函数名前面加上统一的前缀,看下面代码: rust 代码 // rust #[repr(C)] struct Foo{ a:isize, ...
-C link-arg,等同于Clang的-T。 -C opt-level,相当于Clang的-O(我们主要使用-C opt-level=z来嵌入)。 -C lto,相当于Clang的-flto。
使用枚举与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,} ...