Rust: рдмрд┐рдирд╛ #![feature(use_extern_macros)] рдХреЗ proc рдореИрдХреНрд░реЛрдЬрд╝ 2.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдиреБрдкрдпреЛрдЧреА рдирд┐рджрд╛рди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдЕрдкреНрд░реИрд▓ 2017  ┬╖  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 рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЙрд╕реЗ рдлрд╝рдВрдХреНрд╢рди-рдЬреИрд╕реА рдкреНрд░реЛ рдореИрдХреНрд░реЛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

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)] рдХреЗ рд▓рд┐рдПред

рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА @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 рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рдВрдХреЗрдд рд╣реЛрдЧрд╛ ..;)

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрд▓реНрдкрд╛рд╡рдзрд┐ рдХреЗ рд▓рд┐рдП #![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 рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рдВрдХреЗрдд рд╣реЛрдЧрд╛ ..;)

рдпрд╣рд╛рдВ рдХрдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡рддрдГ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрдВрдж рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

mcarton picture mcarton  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dwrensha picture dwrensha  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

eddyb picture eddyb  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Majora320 picture Majora320  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

defuz picture defuz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ