除了禁用警告之外,为什么会这样?
use serde_json::from_str;
use serde_json::error::Result;
#[derive(Deserialize)]
pub struct Config {
#[serde(rename="cudaBlasDylibPath")]
pub cuda_blas_dylib_path: String,
}
impl Config {
pub fn new() -> Result<Config> {
from_str("{}")
}
}
src / config.rs:4:10:4:21警告:未使用的属性,#[warn(unused_attributes)]默认打开 src / config.rs:4#[derive(Deserialize)]
添加#[allow(unused_attributes)]
无济于事。
答案 0 :(得分:5)
这里是编译器的完整输出:
src/main.rs:10:10: 10:21 warning: unused attribute, #[warn(unused_attributes)] on by default
src/main.rs:10 #[derive(Deserialize)]
^~~~~~~~~~~
src/main.rs:10:10: 10:21 note: in this expansion of #[derive_Deserialize] (defined in src/main.rs)
这意味着警告位于impl
属性生成的#[derive]
的代码中。但是,如果没有看到代码,很难理解发生了什么!
幸运的是,我们可以要求编译器向我们展示生成的代码。我们需要将其他参数传递给rustc
,特别是-Z unstable-options --pretty=expanded
。如果您正在使用Cargo,请删除已编译的包装箱或运行cargo clean
(如果目标是最新的,货物不会执行任何操作),然后运行此命令:
$ cargo rustc -- -Z unstable-options --pretty=expanded > src/main-expanded.rs
然后我们可以尝试使用src/main-expanded.rs
编译rustc
。如果您正在使用Cargo,请在运行cargo build --verbose
时使用命令Cargo prints(当目标不是最新时),但用我们刚刚生成的新文件替换根源文件的名称 - 或者您可以将main.rs
或lib.rs
与扩展来源进行交换。它可能并不总是有效,但是当它发挥作用时,它可以提供一些有价值的见解。
我们现在可以更清楚地了解情况:
src/main-expanded.rs:17:5: 17:43 warning: unused attribute, #[warn(unused_attributes)] on by default
src/main-expanded.rs:17 #[serde(rename = "cudaBlasDylibPath")]
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main-expanded.rs:20:1: 20:25 warning: unused attribute, #[warn(unused_attributes)] on by default
src/main-expanded.rs:20 #[automatically_derived]
^~~~~~~~~~~~~~~~~~~~~~~~
这里,#[serde]
属性的警告可能是因为struct不再具有#[derive(Deserialize)]
属性,这是处理属性的原因。此外,它不属于#[derive(Deserialize)]
属性扩展的一部分,因此不是原始警告所抱怨的属性。
看起来#[automatically_derived]
属性是罪魁祸首。该属性似乎主要由rustdoc(文档生成工具)使用,但在编译时没有任何意义。
为#[derive]
已知的可导出特征rustc
的实现会发出如下属性:
let attr = cx.attribute(
self.span,
cx.meta_word(self.span,
InternedString::new("automatically_derived")));
// Just mark it now since we know that it'll end up used downstream
attr::mark_used(&attr);
我的猜测是,serde没有调用mark_used
函数,这是导致警告的原因。 &{34;自动发送&#34;的only occurrences在serde的源代码中调用了quote_item!
宏,它可能不会发出对mark_used
的调用(它也可能不会这样做)。