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

wan*_*021 6 conditional-compilation rust

cargo build以下代码运行将成功:

#[cfg(test)]
mod tests {
    #[test]
    fn func() { 
        let x = 1;
        sss
    }
}
Run Code Online (Sandbox Code Playgroud)

但此代码会失败:

#[cfg(test)]
mod tests {
    #[test]
    fn func() {
        sss
        let x = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)
#[cfg(test)]
mod tests {
    #[test]
    fn func() { 
        let x = 1;
        sss
    }
}
Run Code Online (Sandbox Code Playgroud)

《Rust Book》中关于测试组织的一节说:

测试模块上的注释#[cfg(test)]告诉 Rust 仅在运行时编译并运行测试代码cargo test,而不是在运行时编译 和运行测试代码cargo build

那么为什么 Rust 仍然可以编译mod tests带有 注释的代码#[cfg(test)]呢?

Cha*_*man 7

未编译的代码在语法上cfg仍然必须有效(即成功解析),但仅此而已。

在第一个代码中,let x = 1;是一个普通的变量声明语句,并且是一个从函数sss返回值的尾部表达式。未定义,因此该代码当然无效,但在语法上是有效的。ssssss

然而,在第二个片段中,您有sss- 这是一个表达式,并且必须有一个尾随分号,但事实并非如此。该代码在语法上无效,并且它是cfg门控这一事实并不重要。