在一个extern crate语句之前加上#[macro_use]是什么意思?

42
在 Rust 中,有时我会看到在 extern crate 语句之前出现 #[macro_use]
#[macro_use]
extern crate gotham_derive;

相较于没有#[macro_use],这个有什么作用呢?

extern crate gotham_derive;

3
我对Rust的宏并不十分熟悉,但是看起来,在Rust 2015中需要使用#[macro_use]来告诉编译器你正在使用创建在crate内部定义的宏。 - Jarak
3个回答

37

4
我尝试使用1use serde_derive;代替#[macro_use] extern crate serde_derive;,但失败了! - Hasan A Yousef
4
use serde_derive; 是一个空操作,就像任何没有 ::use 语句一样。你可能想要使用类似 use serde_derive::{Deserialize, Serialize}; 的语句。请注意,这个翻译并没有改变原意,并尽量保持通俗易懂。 - jbg

14
正如Shepmaster已经解释的那样,在较新的Rust版本(2018版及以上)中,这种语法不再需要。然而,在某些情况下仍可能有用,比如全局宏导入。以下是Rocket's documentation的摘录,其中解释了为什么他们更喜欢在代码中使用#[macro_use] extern crate rocket;
在本指南和大部分Rocket文档中,即使Rust 2018版明确导入crate是可选的,我们仍然使用#[macro_use]显式地导入rocket。然而,使用#[macro_use]显式地导入宏会全局导入宏,允许您在应用程序的任何地方使用Rocket的宏,而无需显式导入它们。
您也可以选择显式导入宏或使用绝对路径引用它们:use rocket::get;#[rocket::get]

2
// all the rockets macros import globally. 
//you can use rocket macros anywhere in your application
#[macro_use] extern crate rocket;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接