Angenommen, ich hätte diese beiden Dateien:
// 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!();
}
Wenn ich versuche, diese Dateien mit rustc foo.rs && rustc bar.rs -L.
zu kompilieren, erhalte ich die folgenden Fehler:
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
Wenn ich jetzt dem Rat des Compilers folge und stattdessen #[macro_use]
versuche, wird mir dieser Fehler angezeigt:
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
Aber das war es, was ich in erster Linie hatte!
Die wirkliche Lösung für dieses Problem besteht darin, #![feature(use_extern_macros)]
zu bar.rs
hinzuzufügen. Der Compiler sollte dies stattdessen vorschlagen, wenn er auf ein funktionsähnliches proc-Makro trifft.
Es könnte eine einfache Lösung sein, zumindest die Diagnosemeldung so zu ändern, dass auch kurzfristig vorgeschlagen wird, #![feature(proc_macro)]
zu bar.rs
hinzuzufügen. (Oder lassen Sie die Diagnose zuerst prüfen, ob diese Funktion aktiviert ist, bevor Sie den Vorschlag machen.) Es macht mir nichts aus, einen redundanten Teil des Vorschlags zu haben, solange er auch das eigentliche Problem abdeckt.
Jetzt mit nightly bekomme ich sogar: warning: this feature has been stable since 1.29.0. Attribute no longer needed
für #![feature(proc_macro)]
.
Aber ich habe immer noch die gleichen Probleme wie @lfairy. Und jetzt, wenn ich mein Makro verwenden möchte, bekomme ich error: cannot find macro 'my_macro!' in this scope
. Aber wenn ich use my_crate::my_macro;
hinzufüge, bekomme ich error[E0432]: unresolved import 'my_crate::my_macro'
.
Es scheint, dass man jetzt das Feature proc_macro
durch use_extern_macros
ersetzen muss . Das wäre ein hilfreicher Hinweis in der Attribute is no longer needed
Nachricht.. ;)
Viele Funktionen hier wurden stabilisiert, daher ist dies wahrscheinlich veraltet, also schließen.
Hilfreichster Kommentar
Jetzt mit nightly bekomme ich sogar:
warning: this feature has been stable since 1.29.0. Attribute no longer needed
für#![feature(proc_macro)]
.Aber ich habe immer noch die gleichen Probleme wie @lfairy. Und jetzt, wenn ich mein Makro verwenden möchte, bekomme ich
error: cannot find macro 'my_macro!' in this scope
. Aber wenn ichuse my_crate::my_macro;
hinzufüge, bekomme icherror[E0432]: unresolved import 'my_crate::my_macro'
.Es scheint, dass man jetzt das Feature
proc_macro
durchuse_extern_macros
ersetzen muss . Das wäre ein hilfreicher Hinweis in derAttribute is no longer needed
Nachricht.. ;)