Не удается найти макрос в этой области [дубликат]

После правильной загрузки xml-файла с помощью SimpleXML objecto вы можете сделать print_r($xml_variable), и вы можете легко найти, к каким атрибутам вы можете получить доступ. Как говорили другие пользователи, $xml['id'] также работал для меня.

33
задан Shepmaster 13 December 2016 в 19:08
поделиться

3 ответа

#[macro_use]
mod foo {
    macro_rules! bar {
        () => ()
    }
}

bar!();    // works

Если вы хотите использовать макрос в том же ящике, для вашего макроса, определенному в нем, нужен атрибут #[macro_use].

Если вы хотите использовать макрос в других ящиках, сам макрос также нуждается в атрибуте #[macro_export].

Если вы хотите использовать макросы из других ящиков, инструкция extern crate xxx; требует атрибута #[macro_use] для импорта всех макросов из этого ящика или #[macro_use(cat, dog)], чтобы использовать только макросы cat и dog ].

Макросы могут использоваться только после того, как они были определены. Это означает, что это не работает:

bar!();

#[macro_use]
mod foo {
    macro_rules! bar {
        () => ()
    }
}

Дополнительная информация доступна в Приложение D: Макросы в Язык программирования ржавчины .

43
ответ дан Shepmaster 15 August 2018 в 22:19
поделиться
  • 1
    «Макросы могут использоваться только после того, как они были определены». - Это ключ, потому что вы можете столкнуться с этой ошибкой, даже если вы сделали все, что было сказано правильно. Например, если у вас есть модули macros и foo (который использует макрос из macros), и вы указываете их в алфавитном порядке в ваших lib.rs или main.rs, foo будет загружен перед макросами и код не будет компилироваться. – neverfox 15 August 2017 в 02:55
  • 2

Этот ответ устарел от 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

Для справок в будущем

$ rustc -v
rustc 0.13.0-dev (2790505c1 2014-11-03 14:17:26 +0000)
14
ответ дан ideasman42 15 August 2018 в 22:19
поделиться
  • 1
    Я полностью пропустил этот атрибут. Благодаря! – user 4 November 2014 в 10:21
  • 2
    Кстати, атрибут BTW, #[macro_export] здесь не нужен. Это необходимо только в том случае, если макрос должен быть экспортирован во внешние пользователи ящиков. Если макрос используется только внутри ящика, #[macro_export] не требуется. – Vladimir Matveev 4 November 2014 в 11:30
  • 3
    Большое спасибо за ответ. Я просто хочу добавить, что если ваш файл something.rs использует другие модули, например, с mod foobar;, и этот модуль foobar использует макросы из macro.rs, тогда вы должны поместить mod macro; до mod foobar; для компиляции программы. Мало того, но это не очевидная ИМО. – conradkdotcom 6 February 2015 в 14:26
  • 4
    (n.b. этот ответ устарел, я принял последний ответ, данный Лукасом) – user 1 August 2015 в 12:06

Добавление #![macro_use] к вершине вашего файла, содержащего макросы, приведет к выталкиванию всех макросов в main.rs.

Например, предположим, что этот файл называется node.rs:

#![macro_use]

macro_rules! test {
    () => { println!("Nuts"); }
}

macro_rules! best {
    () => { println!("Run"); }
}

pub fn fun_times() {
    println!("Is it really?");
}

Ваши main.rs будут выглядеть примерно так:

mod node;  //We're using node.rs
mod toad;  //Also using toad.rs

fn main() {
    test!();
    best!();
    toad::a_thing();
}

Наконец, скажем, у вас есть файл с именем toad.rs, который также требует этих макросов:

use node; //Notice this is 'use' not 'mod'

pub fn a_thing() {
  test!();

  node::fun_times();
}

Обратите внимание, что после того, как файлы втянуты в main.rs с помощью mod, остальные ваши файлы имеют доступ к ним с помощью ключевого слова use.

0
ответ дан Luke Dupin 15 August 2018 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: