如何在Rust中使用条件编译宏的示例

如何在Rust中使用条件编译宏的示例,rust,Rust,我已经遵循并尝试了,但我无法让我的代码正常工作 我的Cargo.toml如下所示: [package] name = "Blahblah" version = "0.3.0" authors = ["ergh <derngummit@ahwell.com"] [dependencies] [[bin]] name = "target" path = "src/main.rs" [features] default=["mmap_enabled"] no_mmap=[] mmap_ena

我已经遵循并尝试了,但我无法让我的代码正常工作

我的Cargo.toml如下所示:

[package]
name = "Blahblah"
version = "0.3.0"
authors = ["ergh <derngummit@ahwell.com"]
[dependencies]

[[bin]]
name = "target"
path = "src/main.rs"

[features]
default=["mmap_enabled"]
no_mmap=[]
mmap_enabled=[]
编译器在
if
语句体中都看不到代码,所以我知道
cfg语句的计算结果为false。为什么?


我读过,我知道它不是完全重复的,因为我正在寻找一个功能示例。

测试功能的正确方法是
feature=“name”
,如果您稍微滚动一下,可以看到:

至于如何启用或禁用这些开关,如果您使用的是Cargo, 它们被设置在您的
货物中。toml

[功能]
#默认情况下没有功能
默认值=[]
#在这里添加功能“foo”,然后您就可以使用它了。
#我们的“foo”功能不依赖于任何其他功能。
foo=[]
当您执行此操作时,货物将沿着一个标志传递到
rustc

--cfg feature=“${feature\u name}”
这些
cfg
标志的总和将决定哪些标志被激活, 因此,需要编译哪些代码。让我们看看这个代码:

#[cfg(feature = "foo")]
mod foo {
}

在您的情况下,使用
cfg宏,这将映射到
cfg!(feature=“foo”)

这就是包含或排除整个模块的方式。但我有一小段代码,必须在函数中间进行交换。所以语法和定义不起作用,我明白。我在这里强调的是如何测试特性的语法,即cfg中的内容。它应该是
feature=“name”
,而不仅仅是
cfg(name)
。当你写下包含该内容的回答时,我实际上是在回答我自己的问题。您指出了正确的方法。顺便说一句,互斥功能应该使用单个功能而不是两个独立的功能来完成,例如测试
feature=“mmap”
非(feature=“mmap”)
。具体来说,板条箱的用户可以同时启用
no_mmap
mmap\u enabled
,这似乎是有问题的。我考虑过这一点,1)包是内部的,2)代码是独占的,从某种意义上说,如果另一个是,则不会对其中一个进行评估。酷!听起来一切都在你的控制之下。(我只是想让你知道如何取舍。)
#[cfg(feature = "foo")]
mod foo {
}