Rust: تشخيص غير مفيد عند استخدام وحدات ماكرو proc 2.0 بدون #! [ميزة (use_extern_macros)]

تم إنشاؤها على ١٧ أبريل ٢٠١٧  ·  3تعليقات  ·  مصدر: rust-lang/rust

افترض أن لدي هذين الملفين:

// 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

التعليق الأكثر فائدة

الآن مع كل ليلة أحصل على: 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 .. ؛)

ال 3 كومينتر

قد يكون حلًا سهلاً لتغيير رسالة التشخيص على الأقل لاقتراح إضافة #![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 .. ؛)

تم تثبيت العديد من الميزات هنا ، لذلك من المحتمل أن يكون هذا قديمًا ، لذا أغلق.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات