Misalkan saya memiliki dua file ini:
// 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!();
}
Ketika saya mencoba mengkompilasi file-file ini dengan rustc foo.rs && rustc bar.rs -L.
, saya mendapatkan kesalahan berikut:
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
Sekarang, jika saya mengikuti saran kompiler dan mencoba #[macro_use]
sebagai gantinya, saya disajikan dengan kesalahan ini:
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
Tapi itulah yang saya miliki di tempat pertama!
Solusi nyata untuk masalah ini adalah menambahkan #![feature(use_extern_macros)]
ke bar.rs
. Kompiler harus menyarankan ini sebagai gantinya ketika menemukan makro proc seperti fungsi.
Mungkin perbaikan mudah untuk setidaknya mengubah pesan diagnostik untuk juga menyarankan menambahkan #![feature(proc_macro)]
ke bar.rs
untuk jangka pendek. (Atau minta pemeriksaan diagnostik terlebih dahulu apakah fitur itu diaktifkan sebelum membuat saran.) Saya tidak keberatan memiliki bagian saran yang berlebihan selama itu mencakup masalah sebenarnya juga.
Sekarang dengan nightly saya bahkan mendapatkan: warning: this feature has been stable since 1.29.0. Attribute no longer needed
untuk #![feature(proc_macro)]
.
Tapi saya masih memiliki masalah yang sama dengan @lfairy. Dan sekarang jika saya ingin menggunakan makro saya, saya mendapatkan error: cannot find macro 'my_macro!' in this scope
. Tetapi jika saya menambahkan use my_crate::my_macro;
saya mendapatkan error[E0432]: unresolved import 'my_crate::my_macro'
.
Tampaknya sekarang perlu mengganti fitur proc_macro
dengan use_extern_macros
. Itu akan menjadi petunjuk yang berguna dalam pesan Attribute is no longer needed
.. ;)
Banyak fitur di sini telah distabilkan, jadi ini kemungkinan sudah basi, jadi tutup.
Komentar yang paling membantu
Sekarang dengan nightly saya bahkan mendapatkan:
warning: this feature has been stable since 1.29.0. Attribute no longer needed
untuk#![feature(proc_macro)]
.Tapi saya masih memiliki masalah yang sama dengan @lfairy. Dan sekarang jika saya ingin menggunakan makro saya, saya mendapatkan
error: cannot find macro 'my_macro!' in this scope
. Tetapi jika saya menambahkanuse my_crate::my_macro;
saya mendapatkanerror[E0432]: unresolved import 'my_crate::my_macro'
.Tampaknya sekarang perlu mengganti fitur
proc_macro
denganuse_extern_macros
. Itu akan menjadi petunjuk yang berguna dalam pesanAttribute is no longer needed
.. ;)