Rust: 使用没有 #![feature(use_extern_macros)] 的 proc 宏 2.0 时的无用诊断

创建于 2017-04-17  ·  3评论  ·  资料来源: rust-lang/rust

假设我有这两个文件:

// foo.rs
#![crate_type = "proc-macro"]

extern crate proc_macro;
use proc_macro::TokenStream;

#[proc_macro]
pub fn foo(x: TokenStream) -> TokenStream {
    x
}
// bar.rs
extern crate foo;
use foo::foo;

fn main() {
    foo!();
}

当我尝试使用rustc foo.rs && rustc bar.rs -L.编译这些文件时,出现以下错误:

warning: proc macro crates and `#[no_link]` crates have no effect without `#[macro_use]`
 --> bar.rs:1:1
  |
1 | extern crate foo;
  | ^^^^^^^^^^^^^^^^^

error[E0432]: unresolved import `foo::foo`
 --> bar.rs:2:5
  |
2 | use foo::foo;
  |     ^^^^^^^^ no `foo` in the root

error: cannot find macro `foo!` in this scope
 --> bar.rs:5:5
  |
5 |     foo!();
  |     ^^^

error: aborting due to 2 previous errors

现在,如果我遵循编译器的建议并尝试使用#[macro_use] ,则会出现以下错误:

error: procedural macros cannot be imported with `#[macro_use]`
 --> bar.rs:5:5
  |
5 |     foo!();
  |     ^^^
  |
  = help: instead, import the procedural macro like any other item: `use foo::foo;`

error: aborting due to previous error

但这就是我最初拥有的!

这个问题的真正解决方案是将#![feature(use_extern_macros)]添加到bar.rs 。 编译器在遇到类似函数的 proc 宏时应该建议这样做。

A-diagnostics A-macros-2.0 C-enhancement

最有用的评论

现在每晚我什至得到: warning: this feature has been stable since 1.29.0. Attribute no longer needed for #![feature(proc_macro)]

但我仍然有与@lfairy 相同的问题。 现在,如果我想使用我的宏,我会得到error: cannot find macro 'my_macro!' in this scope 。 但是如果我添加use my_crate::my_macro;我会得到error[E0432]: unresolved import 'my_crate::my_macro'

现在似乎需要use_extern_macros替换功能proc_macro #$ 。 这将是Attribute is no longer needed消息中的有用提示.. ;)

所有3条评论

至少将诊断消息更改为建议在短期内将#![feature(proc_macro)]添加到bar.rs可能是一个简单的解决方法。 (或者在提出建议之前先让诊断检查该功能是否启用。)我不介意建议的冗余部分,只要它也涵盖了真正的问题。

现在每晚我什至得到: warning: this feature has been stable since 1.29.0. Attribute no longer needed for #![feature(proc_macro)]

但我仍然有与@lfairy 相同的问题。 现在,如果我想使用我的宏,我会得到error: cannot find macro 'my_macro!' in this scope 。 但是如果我添加use my_crate::my_macro;我会得到error[E0432]: unresolved import 'my_crate::my_macro'

现在似乎需要use_extern_macros替换功能proc_macro #$ 。 这将是Attribute is no longer needed消息中的有用提示.. ;)

这里的许多功能已经稳定,所以这可能是陈旧的,所以关闭。

此页面是否有帮助?
0 / 5 - 0 等级