افترض أن لدي هذين الملفين:
// 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
مقابل #![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'
.
يبدو أن المرء يحتاج الآن إلى استبدال الميزة proc_macro
بـ use_extern_macros
. سيكون هذا تلميحًا مفيدًا في رسالة Attribute is no longer needed
.. ؛)
تم تثبيت العديد من الميزات هنا ، لذلك من المحتمل أن يكون هذا قديمًا ، لذا أغلق.
التعليق الأكثر فائدة
الآن مع كل ليلة أحصل على:
warning: this feature has been stable since 1.29.0. Attribute no longer needed
مقابل#![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'
.يبدو أن المرء يحتاج الآن إلى استبدال الميزة
proc_macro
بـuse_extern_macros
. سيكون هذا تلميحًا مفيدًا في رسالةAttribute is no longer needed
.. ؛)