Rust 编程: 条件编译-Features

rust中编译宏控 从上边的测试例子我们可以看到,通过toml配置,然后通过编译参数可以指定某些feature是否生效。 阅读详情

Rust 编程: 条件编译-Features

Rust 支持条件编译,可通过两种不同的操作实现:

  • cfg 属性:在属性位置中使用 #[cfg(...)]
  • cfg! 宏:在布尔表达式中使用 cfg!(...)

// 根据操作系统引用不同文件的相同模块
#[cfg_attr(target_os = "linux", path = "linux.rs")]
#[cfg_attr(windows, path = "windows.rs")]
mod os;

// 函数仅当操作系统是 Linux 的时候才会编译
#[cfg(target_os = "linux")]
fn do_on_linux() {
    println!("You are running linux!")
}

// 函数仅当操作系统不是 Linux 的时候才会编译
#[cfg(not(target_os = "linux"))]
fn do_on_notlinux() {
    println!("You are *not* running linux!")
}

if cfg!(target_os = "windows") {
  // windows系统要执行的代码段
} else if cfg!(target_os = "linux") {
  // linux系统要执行的代码段
}

// 依赖自设条件是否引用模块 foo
#[cfg(feature = "foo")]
mod foo;

1. 参考资料

2. 类型条件

Rust 预设类型条件:

  • target_family : 目标操作系统的类别,比如windows和unix。这个属性可以直接作为条件使用,如#[unix],#[cfg(unix)]
  • target_arch : 目标平台的CPU架构,包括但不限于x86, x86_64, mips, powerpc, arm或aarch64
  • target_os : 目标操作系统,包括但不限于windows, macos, ios, linux, android, freebsd, dragonfly, bitrig, openbsd, netbsd
  • target_pointer_width : 目标平台的指针宽度,一般就是32或64
  • test : 启动单元测试(即编译时加了–test参数,或使用cargo test)

3. 限定条件

Rust 支持使用any,all,not等限定条件编译的条件之间的关系

4. 自设条件


// 自设条件 myfeaone 为真才会编译
#[cfg(myfeaone)]
fn do_myfeaone() {
    println!("do_myfeaone!")
}

fn main() {
    do_myfeaone();

    if cfg!(feature = "myfeatwo") {
      // 自设条件 myfeatwo 为真要执行的代码段
    }

}

4.1. rustc 编译


rustc --cfg feature="myfeaone myfeatwo" demo.rs

4.2. cargo 编译

  1. 修改 cargo.toml

[features]
myfeaone = []
myfeatwo = []

  1. 条件编译

cargo build --features="myfeaone myfeatwo"

5. 传递条件

Rust 的模块化系统: 包Packages, 箱Crates, 和模块Modules

  • packages: 通过cargo new 创建;
  • crates: 通过cargo new --lib 创建。有根包和子包。即一个根包下可以包含多个子包。
  • modules: 通过关键字mod加模块定义

Rust/Cargo 自设条件如何从根包传递到子包?

  1. 修改根包 cargo.toml

[features]
myfeaone = ["subcrateone/myfeaone", "subcratetwo/myfeaone"]
myfeatwo = ["subcrateone/myfeatwo", "subcratetwo/myfeatwo"]

  1. 修改子包 cargo.toml

[features]
myfeaone = []
myfeatwo = []

  1. 在根包目录下,条件编译

cargo build --features="myfeaone myfeatwo"

157、掌握Rust条件编译:提升代码可移植性与灵活性 本文深入介绍了Rust条件编译特性,特别是`#[cfg]`属性的应用。我们探讨了如何根据目标平台、操作系统、编译标志和调试模式来条件编译代码。通过实际案例和技巧,我们揭示了如何提高代码的可移植性和灵活性。文章强调了正确使用条件编译逻辑的重要性,以及如何确保代码在不同的编译环境下正确编译。 阅读详情

相关推荐

rust程序编译、使用过程中遇到的一些问题

cargo 升级问题解决 https://stackoverflow.com/questions/37928591/is-there-a-command-to-update-cargo-to-the-latest-official-release 在使用依赖库涉及到dalek的时候,报以下错误: 这是因为该feature在21年2月就被弃用了,而我们的rust版本太高(1.56.0 nightly),导致出现了以上错误。处理该问题,可以将rust版本降级。但是由于这个feature是一个文档编辑,对.

weixin_38243001的博客 2391

Rust学习之Features

Rust中的Cargo Features学习

天草降临的博客 2820

Rust交叉编译与条件编译实战指南

交叉编译是现代软件开发中的关键技术,它允许开发者在单一平台上为多种目标架构生成可执行文件。Rust语言通过其强大的工具链和条件编译系统,为跨平台开发提供了卓越支持。在系统级编程中,条件编译(通过`#[cfg]`属性实现)能够根据目标平台特性选择性地包含代码,这对处理平台特定API和优化性能至关重要。Rust的`rustup`工具链管理使得为Android、iOS等平台配置交叉编译环境变得简单高效。实际工程中,这些技术可显著提升开发效率,特别是在嵌入式系统、移动应用开发和云原生场景下。本文通过具体示例展示了如

weixin_30527323的博客 333

Rust使用feature特性和条件编译,以及常用feature使用说明

Cargo Feature 是非常强大的机制,可以为大家提供条件编译和可选依赖的高级特性,可以为你省下不少的代码量来判断操作系统和条件编译等功能。rust官方条件编译文档

3669

rust cfg 条件编译 feature 与集成测试】

rust cfg 条件编译与集成测试

u010704579的博客 1278

推荐开源项目:cargo-all-features - 打造全面的Rust特征测试神器

推荐开源项目:cargo-all-features - 打造全面的Rust特征测试神器 在Rust生态系统中,充分利用特征旗帜(feature flags)能极大地提升库的灵活性和可配置性。然而,随着项目的复杂度增加,手动管理并测试每一个特征组合成为了一项挑战。针对这一痛点,我们有理由隆重推荐一个强大的工具——cargo-all-features,它旨在自动化构建和测试Rust项目的所有特征标志组...

gitblog_01148的博客 822

Upcoming Rust language features for kernel development

文章摘要: RustforLinux项目正在推动Rust语言的关键特性发展,主要包括字段投影、就地初始化和任意self类型三大特性。字段投影允许将结构体指针转换为字段指针,Lossin介绍了其设计进展;任意self类型由丁向飞开发,可使智能指针支持方法调用语法;就地初始化方案旨在简化内存分配语法。这些特性将显著改善内核开发体验,尽管仍需时间完善。Rust语言团队表示,该项目通过聚焦特定需求有效推动了语言发展,相关特性预计将在2027年Debian14发布后广泛应用于内核代码。

mounter625的专栏 1008

Rust Music Theory实战:用nocturne.rs示例学习音乐编程

Rust Music Theory是一个用Rust编写的音乐理论指南项目,它不仅包含音乐理论知识,还提供了丰富的示例代码帮助开发者快速上手音乐编程。本文将通过分析nocturne.rs示例,带您一步步探索如何用Rust实现音乐创作与播放,让编程与音乐完美结合。 ## 🎹 认识nocturne.rs:肖邦风格夜曲的Rust实现 在项目的examples目录下,您可以找到多个音乐示例,其中[no

gitblog_00038的博客 1154

Rust 2024 - Cargo:拒绝未使用的继承 default-features

Rust 2024 Edition 对 Cargo 工作空间继承的 default-features 行为进行了调整:当工作空间依赖未显式设置 default-features = false 时,禁止在继承的包依赖中指定 default-features = false。这一变更旨在消除默认特性已启用时无效设置的混淆。迁移时可通过 cargo fix --edition 自动移除冲突项,或手动删除相关配置。该调整确保依赖特性声明更加明确一致。

341

Rustix库:Rust 系统编程 的 基石

rustix不是简单的系统调用包装器,而是 Rust 系统编程的基础设施。它解决了传统系统编程中安全性与性能难以兼顾的核心矛盾,让你可以用 Rust 的安全特性编写接近内核的底层代码

码刀攻城 518

DeepSeek-TUI:基于MCP协议的Rust终端编程Agent

MCP(Model Context Protocol)是一种面向大模型工程化应用的上下文通信协议,旨在让AI理解代码在项目中的位置、依赖与变更状态。其核心原理是将文件路径、Git状态、终端历史等元信息结构化注入模型请求,从而突破传统CLI工具缺乏上下文感知的瓶颈。该协议显著提升模型在真实开发场景中的准确性与可执行性,尤其适用于无GUI服务器、CI/CD流水线及嵌入式开发等受限环境。结合Rust构建的高性能运行时与DeepSeek-v4-pro等专业模型深度适配,MCP驱动的终端Agent已逐步成为开发者在命

weixin_30650039的博客 509

RUST Rover 条件编译 异常处理

异常 error: failed to parse manifest at [features] conditional compilation 条件编译

qq_42254853的博客 817

Rust的cargo特性标志与条件编译在库功能开关中的配置管理

通过特性标志(feature flags)和条件编译(conditional compilation),开发者可以灵活控制库的功能模块,实现按需编译和依赖优化。cargo test支持--features参数来测试特定功能组合,而#[cfg_attr(feature = "docs", doc(cfg(...)))]语法能为特性相关的API生成专属文档。这种细粒度控制大幅提升了代码的可维护性。这种配置管理方式不仅提升了代码的灵活性,还为最终用户提供了更精细的控制能力,是构建可维护、高性能库的关键技术。

xeteng_984的博客 220

Rust编程:从新手到大师】Cargo 进阶知识全解析

本文深入解析Cargo作为Rust官方构建工具的高级用法。从配置体系入手,详解项目级到全局级的层级配置覆盖原则,重点分析package元信息、profile优化配置、source源替换和target跨平台配置等核心功能。在依赖管理方面,系统介绍4种依赖类型、版本控制策略和多种依赖来源。同时阐述构建流程定制方法,包括build.rs构建脚本的使用。通过优化配置、高效管理依赖和灵活定制构建流程,帮助开发者实现Rust项目的工程化和规范化管理。

【安歌er】的博客 992

Rust开发者必看:Tapo项目核心模块与异步编程最佳实践

Tapo项目是一个为TP-Link Tapo智能设备提供Rust API、Python API和MCP服务器的开源项目,采用异步编程模型实现高效的设备通信和控制。本文将深入剖析Tapo项目的核心模块架构与异步编程实践,帮助Rust开发者掌握异步代码设计的精髓。 ## 一、项目核心模块架构解析 Tapo项目采用模块化设计,主要分为三个核心部分:Rust API层、协议处理层和设备交互层,各模块通

gitblog_00581的博客 788

rules_rust进阶:proc_macro构建和复杂项目结构的最佳实践

在使用Bazel构建Rust项目时,`rules_rust`提供了强大的支持,尤其对于包含过程宏(proc_macro)和复杂依赖关系的项目。本文将深入探讨proc_macro的构建方法和大型项目的结构优化策略,帮助开发者高效管理Rust代码库。 ## 过程宏(proc_macro)的Bazel构建指南 🛠️ 过程宏是Rust中强大的元编程工具,但在Bazel环境中需要特殊配置才能正确编译。

gitblog_00176的博客 426

从libpcap到Rust pcap:跨平台网络编程的无缝过渡

Rust pcap是一个强大的Rust语言库,它为开发者提供了访问libpcap(Windows上为Npcap)数据包嗅探功能的能力。无论是列出网络设备、捕获数据包,还是使用BPF程序过滤数据包,Rust pcap都能轻松胜任,是网络编程爱好者和专业开发者的理想选择。 ## 🚀 为什么选择Rust pcap? Rust pcap在保留libpcap核心功能的基础上,融入了Rust语言的安全特

gitblog_01027的博客 384

深度解析tmux-rs架构:Rust实现终端复用的核心技术

tmux-rs是一个采用Rust语言重写的tmux终端复用器项目,它通过Rust的内存安全特性和现代并发模型,为经典的tmux工具带来了新的技术实现。该项目不仅保留了tmux的核心功能,还在架构设计上进行了现代化重构,为系统管理员和开发者提供了更安全、更高效的终端复用解决方案。 ## 技术背景与项目定位 在当今的多任务开发环境中,终端复用器已成为开发者和系统管理员不可或缺的工具。传统的tmux

gitblog_00321的博客 1085
下一篇: Windows10测试模式导致Xilinx-Vivado后台崩溃
Codings
博客等级 码龄17年 39粉丝 25原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值