IT박스

모듈 파일에서 매크로를 어떻게 사용합니까?

itboxs 2020. 12. 30. 07:53
반응형

모듈 파일에서 매크로를 어떻게 사용합니까?


상자가 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)]단지 매크로를 가져올 수 수 catdog.이 구문은 더 이상 필요는 없습니다.)


더 많은 정보는 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

반응형