如何在Rust中使用条件编译宏的示例
我已经遵循并尝试了,但我无法让我的代码正常工作 我的Cargo.toml如下所示:如何在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
[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 {
}