Можно ли испускать атрибуты 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);
}
Ваш реальный вопрос ближе к "возможно ли вызвать макрос внутри атрибута". Ответом на этот вопрос будет " нет" - парсер не ожидает расширения макроса в этом месте. Возможно, вы хотите посмотреть на генерацию кода или процедурные макросы, в зависимости от того, что вы пытаетесь сделать.