次の2つのファイルがあるとします。
// 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
に追加することを提案するのは簡単な修正かもしれません。 (または、提案を行う前に、診断でその機能が有効になっているかどうかを最初に確認してください。)実際の問題もカバーしている限り、提案の冗長部分があってもかまいません。
今では毎晩、 #![feature(proc_macro)]
warning: this feature has been stable since 1.29.0. Attribute no longer needed
を取得します。
しかし、私はまだ@lfairyと同じ問題を抱えています。 そして、マクロを使用したい場合は、 error: cannot find macro 'my_macro!' in this scope
を取得します。 しかし、 use my_crate::my_macro;
を追加すると、 error[E0432]: unresolved import 'my_crate::my_macro'
になります。
機能proc_macro
をuse_extern_macros
に置き換える必要があるようです。 これは、 Attribute is no longer needed
メッセージのヒントになります。.;)
ここの多くの機能は安定しているので、これはおそらく古くなっているので、閉じます。
最も参考になるコメント
今では毎晩、
#![feature(proc_macro)]
warning: this feature has been stable since 1.29.0. Attribute no longer needed
を取得します。しかし、私はまだ@lfairyと同じ問題を抱えています。 そして、マクロを使用したい場合は、
error: cannot find macro 'my_macro!' in this scope
を取得します。 しかし、use my_crate::my_macro;
を追加すると、error[E0432]: unresolved import 'my_crate::my_macro'
になります。機能
proc_macro
をuse_extern_macros
に置き換える必要があるようです。 これは、Attribute is no longer needed
メッセージのヒントになります。.;)