我在想这种事有没有可能
fn main() { #[cfg(foo)] { println!("using foo config"); } }
上下文是一些仅用单元测试无法充分测试的代码。我经常需要运行一个显示信息的“demo”cfg。我正在寻找手动注解某些代码部分的替代方法。
c9x0cxw01#
至少在Rust 1.21.1中,可以完全按照您所说的那样执行此操作(但是,* 仅在函数内部 *):
在此之前,不可能完全有条件地做到这一点(即。避免整个块被类型检查),RFC #16涵盖了这一点。但是,您可以使用cfg宏,根据--cfg标志计算为true或false:
cfg
--cfg
true
false
fn main() { if cfg!(foo) { // either `if true { ... }` or `if false { ... }` println!("using foo config"); } }
if的主体总是运行名称解析和类型检查,因此可能并不总是有效。
if
v1l68za42#
你可能对crate cfg-if感兴趣,或者一个简单的宏就可以了:
macro_rules! conditional_compile { ($(#[$ATTR:meta])* { $CODE: tt }) => { { match 0 { $(#[$ATTR])* 0 => $CODE, // suppress clippy warnning `single_match`. 1 => (), _ => (), } } } } fn main() { conditional_compile{ #[cfg(foo)] {{ println!("using foo config"); // Or something only exists in cfg foo, like a featured mod. }} } }
2条答案
按热度按时间c9x0cxw01#
至少在Rust 1.21.1中,可以完全按照您所说的那样执行此操作(但是,* 仅在函数内部 *):
在此之前,不可能完全有条件地做到这一点(即。避免整个块被类型检查),RFC #16涵盖了这一点。但是,您可以使用
cfg
宏,根据--cfg
标志计算为true
或false
:if
的主体总是运行名称解析和类型检查,因此可能并不总是有效。v1l68za42#
你可能对crate cfg-if感兴趣,或者一个简单的宏就可以了: