рдорд╛рди рд▓реАрдЬрд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдпреЗ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдереАрдВ:
// 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
рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЙрд╕реЗ рдлрд╝рдВрдХреНрд╢рди-рдЬреИрд╕реА рдкреНрд░реЛ рдореИрдХреНрд░реЛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
рдЕрд▓реНрдкрд╛рд╡рдзрд┐ рдХреЗ рд▓рд┐рдП #![feature(proc_macro)]
рд╕реЗ bar.rs
рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрд╕рдВрджреЗрд╢ рдХреЛ рдмрджрд▓рдирд╛ рдПрдХ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред (рдпрд╛ рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рдкрд╣рд▓реЗ рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рдХреНрд╖рдо рд╣реИред) рдЬрдм рддрдХ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рднреА рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ, рддрдм рддрдХ рдореБрдЭреЗ рд╕реБрдЭрд╛рд╡ рдХрд╛ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред
рдЕрдм рд░рд╛рдд рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдпрд╣ рднреА рдорд┐рд▓рддрд╛ рд╣реИ: warning: this feature has been stable since 1.29.0. Attribute no longer needed
#![feature(proc_macro)]
рдХреЗ рд▓рд┐рдПред
рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА @lрдлреЗрдпрд░реА рдЬреИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдФрд░ рдЕрдм рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ 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)]
рдХреЗ рд▓рд┐рдПредрд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА @lрдлреЗрдпрд░реА рдЬреИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдФрд░ рдЕрдм рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ
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
рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рдВрдХреЗрдд рд╣реЛрдЧрд╛ ..;)