为什么无效的代码注释' #[cfg(test)] '仍然导致构建失败?



对于以下代码,运行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门控的事实并不重要。