对于以下代码,运行cargo build
将成功:
#[cfg(test)]
mod tests {
#[test]
fn func() {
let x = 1;
sss
}
}
但是会失败:
#[cfg(test)]
mod tests {
#[test]
fn func() {
sss
let x = 1;
}
}
error: expected `;`, found keyword `let`
--> src/lib.rs:5:12
|
5 | sss
| ^ help: add `;` here
6 | let x = 1;
| --- unexpected token
Rust Book中关于测试组织的一节说:
测试模块上的
#[cfg(test)]
注释告诉Rust编译并且只在运行cargo test
时运行测试代码,而不是在运行时运行cargo build
.
那么为什么Rust还在编译#[cfg(test)]
注释的mod tests
?
未使用cfg
编译的代码必须仍然在语法上有效(即解析成功),但仅此而已。
在第一段代码中,let x = 1;
是一个普通的变量声明语句,sss
是一个从函数返回sss
值的尾随表达式。sss
没有定义,因此这段代码当然是无效的,但是它在语法上是有效的。然而,在第二个代码片段中,您有sss
—这是一个表达式,必须有一个末尾的分号,但它没有。这段代码在语法上是无效的,并且它是cfg
门控的事实并不重要。