모듈 파일에서 매크로를 어떻게 사용합니까?
상자가 macro_rules
활성화 된 동일한 상자 내에 별도의 파일에 두 개의 모듈이 있습니다. 다른 모듈의 한 모듈에 정의 된 매크로를 사용하고 싶습니다.
// macros.rs
#[macro_export] // or not? is ineffectual for this, afaik
macro_rules! my_macro(...)
// something.rs
use macros;
// use macros::my_macro; <-- unresolved import (for obvious reasons)
my_macro!() // <-- how?
나는 현재 컴파일러 오류 " macro undefined: 'my_macro'
"를 쳤다 . 매크로 시스템은 모듈 시스템보다 먼저 실행됩니다. 이 문제를 어떻게 해결합니까?
동일한 상자 내의 매크로
#[macro_use]
mod foo {
macro_rules! bar {
() => ()
}
}
bar!(); // works
동일한 상자에서 매크로를 사용하려면 매크로가 정의 된 모듈에 속성이 필요합니다 #[macro_use]
.
매크로는 정의 된 후에 만 사용할 수 있습니다 . 이것은 이것이 작동하지 않음을 의미합니다.
bar!(); // ERROR: cannot find macro `bar!` in this scope
#[macro_use]
mod foo {
macro_rules! bar {
() => ()
}
}
상자를 가로 지르는 매크로
macro_rules!
다른 상자 의 매크로 를 사용하려면 매크로 자체에 속성이 필요합니다 #[macro_export]
. 가져 오는 크레이트는를 통해 매크로를 가져올 수 있습니다 use crate_name::macro_name;
.
// --- Crate `util` ---
#[macro_export]
macro_rules! foo {
() => ()
}
// --- Crate `user` ---
use util::foo;
foo!();
참고 : 매크로는 항상 상자의 최상위 수준에 있습니다. 해도 너무 foo
돌며 것 mod bar {}
의 user
상자는 여전히 작성해야 use util::foo;
하고 하지 use util::bar::foo;
.
(녹 2,018하기 전에 속성을 추가하여 다른 상자에서 가져 오기 매크로로했다 #[macro_use]
받는 extern crate util;
그에서 모든 매크로를 가져올 것이다. 문 util
또는. #[macro_use(cat, dog)]
단지 매크로를 가져올 수 수 cat
와 dog
.이 구문은 더 이상 필요는 없습니다.)
더 많은 정보는 The Rust Programming Language에 있습니다.
이 답변은 Rust 1.1.0-stable에서 구식입니다.
매크로 가이드에 언급 된대로 #![macro_escape]
맨 위에 추가 macros.rs
하고 포함해야합니다 .mod macros;
$ cat macros.rs
#![macro_escape]
#[macro_export]
macro_rules! my_macro {
() => { println!("hi"); }
}
$ cat something.rs
#![feature(macro_rules)]
mod macros;
fn main() {
my_macro!();
}
$ rustc something.rs
$ ./something
hi
For future reference,
$ rustc -v
rustc 0.13.0-dev (2790505c1 2014-11-03 14:17:26 +0000)
Adding #![macro_use]
to the top of your file containing macros will cause all macros to be pulled into main.rs.
For example, let's assume this file is called node.rs:
#![macro_use]
macro_rules! test {
() => { println!("Nuts"); }
}
macro_rules! best {
() => { println!("Run"); }
}
pub fn fun_times() {
println!("Is it really?");
}
Your main.rs would look sometime like the following:
mod node; //We're using node.rs
mod toad; //Also using toad.rs
fn main() {
test!();
best!();
toad::a_thing();
}
Finally let's say you have a file called toad.rs that also requires these macros:
use node; //Notice this is 'use' not 'mod'
pub fn a_thing() {
test!();
node::fun_times();
}
Notice that once files are pulled into main.rs with mod
, the rest of your files have access to them through the use
keyword.
ReferenceURL : https://stackoverflow.com/questions/26731243/how-do-i-use-a-macro-across-module-files
'IT박스' 카테고리의 다른 글
변형 버그 : 스케일 및 오버 플로우 : Chrome에서 숨김 (0) | 2020.12.30 |
---|---|
RedirectToAction에서 모델을 매개 변수로 전달할 수 있습니까? (0) | 2020.12.30 |
문자열에서 "두 번 나타나는 한 글자"찾기 (0) | 2020.12.30 |
가져 오기 : JSON 오류 객체로 약속 거부 (0) | 2020.12.29 |
iOS에서 오디오 볼륨 레벨 및 볼륨 변경 알림을받는 방법은 무엇입니까? (0) | 2020.12.29 |