假设我有这两个文件:
// 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 宏时应该建议这样做。
至少将诊断消息更改为还建议在短期内将#![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
消息中的有用提示.. ;)
这里的许多功能已经稳定,所以这可能是陈旧的,所以关闭。
最有用的评论
现在每晚我什至得到:
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
消息中的有用提示.. ;)