如何通过bindgen配置仅生成#[derive(Clone)]而不生成Copy派生?
bindgen 仅派生 Clone 的配置方案
bindgen 默认会为符合内存布局要求的类型自动派生 Debug、Copy、Clone 三个 trait,你当前配置中显式开启了 .derive_copy(true),进一步强化了 Copy 派生逻辑,因此生成的结构体会同时携带三个派生属性。
按以下步骤修改配置即可实现仅自动派生 Clone:
- 移除原有配置中的
.derive_copy(true),替换为.derive_copy(false)关闭全局 Copy 自动派生 - 添加
.derive_debug(false)关闭全局 Debug 自动派生 - 显式添加
.derive_clone(true)保留全局 Clone 自动派生
修改后的完整配置代码:
let mut builder = bindgen::Builder::default() .clang_arg("-std=c++11") .clang_arg("-x") .clang_arg("c++") .clang_arg("-Wno-pragma-once-outside-header") .layout_tests(false) .derive_copy(false) .derive_debug(false) .derive_clone(true) .enable_cxx_namespaces() .default_enum_style(EnumVariation::Rust { non_exhaustive: false, });
如果需要对单个类型做定制化派生控制,可以使用粒度更细的配置方法:
- 禁止特定类型的所有自动派生:
.blocklist_derive("需要屏蔽的类型名") - 仅允许特定类型额外派生指定trait:
.allowlist_derive("需要开放的类型名", "Trait名称")
内容的提问来源于stack exchange,提问作者calvin
相关产品推荐
相关产品推荐

