Можно ли испускать атрибуты Rust из макросов?

Я пытаюсь сделать что-то вроде следующего:

macro_rules! attr_trial {
    ($msg:expr) => {{
        let id = env!("SOME_ENV");

        #[link_section = env!("SOME_ENV")]
        static MESSAGE: &'static str = $msg;
    }};
}

И я получаю следующую ошибку:

error: unexpected token: `env`
  --> src/main.rs:34:18
   |
34 |            #[link_section = env!("SOME_ENV")]
   |                           ^

1 ответ

Решение

Можно ли испускать атрибуты Rust из макросов?

Абсолютно, это возможно. Вот макрос, который испускает test атрибут из макроса:

macro_rules! example {
    () => {
        #[test]
        fn test() {
            assert!(false);
        }
    };
}

example!();

Однако это возможно не во всех контекстах. Например, вы не можете испустить только атрибут, потому что ожидается, что атрибут будет прикреплен к элементу:

macro_rules! example {
    () => {
        #[test]
    };
}

// Fails!
example!();
fn test() {
    assert!(false);
}

Ваш реальный вопрос ближе к "возможно ли вызвать макрос внутри атрибута". Ответом на этот вопрос будет " нет" - парсер не ожидает расширения макроса в этом месте. Возможно, вы хотите посмотреть на генерацию кода или процедурные макросы, в зависимости от того, что вы пытаетесь сделать.

Другие вопросы по тегам