ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΈ ΡΡΠΈ Π΄Π²Π° ΡΠ°ΠΉΠ»Π°:
// 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
Π½Π° ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ ΡΡΠΎΠΊ. (ΠΠ»ΠΈ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, Π²ΠΊΠ»ΡΡΠ΅Π½Π° Π»ΠΈ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π΄Π΅Π»Π°ΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅.) Π― Π½Π΅ Π²ΠΎΠ·ΡΠ°ΠΆΠ°Ρ ΠΏΡΠΎΡΠΈΠ² ΠΈΠ·Π±ΡΡΠΎΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΡ
Π²Π°ΡΡΠ²Π°Π΅Ρ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
Π’Π΅ΠΏΠ΅ΡΡ Ρ nightly Ρ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠ°Ρ: 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
.. ;)
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π΄Π΅ΡΡ Π±ΡΠ»ΠΈ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ, ΡΠ°ΠΊ ΡΡΠΎ ΡΡΠΎ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΡΠ°ΡΠ΅Π»ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π·Π°ΠΊΡΡΠ²Π°Ρ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π’Π΅ΠΏΠ΅ΡΡ Ρ nightly Ρ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠ°Ρ:
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
.. ;)