Rust: #![feature(use_extern_macros)]なしでprocマクロ2.0を使用する場合の役に立たない診断

作成日 2017年04月17日  ·  3コメント  ·  ソース: rust-lang/rust

次の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マクロに遭遇したときに、代わりにこれを提案する必要があります。

A-diagnostics A-macros-2.0 C-enhancement

最も参考になるコメント

今では毎晩、 #![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_macrouse_extern_macrosに置き換える必要があるようです。 これは、 Attribute is no longer neededメッセージのヒントになります。.;)

全てのコメント3件

少なくとも診断メッセージを変更して、短期的に#![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_macrouse_extern_macrosに置き換える必要があるようです。 これは、 Attribute is no longer neededメッセージのヒントになります。.;)

ここの多くの機能は安定しているので、これはおそらく古くなっているので、閉じます。

このページは役に立ちましたか?
0 / 5 - 0 評価