macros rust

¿Es posible emitir atributos de Rust desde macros?



(1)

Estoy tratando de hacer algo como lo siguiente:

macro_rules! attr_trial { ($msg:expr) => {{ let id = env!("SOME_ENV"); #[link_section = env!("SOME_ENV")] static MESSAGE: &''static str = $msg; }}; }

Y obtengo el siguiente error:

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


¿Es posible emitir atributos de Rust desde macros?

Absolutamente , es posible. Aquí hay una macro que emite un atributo de test dentro de una macro:

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

Sin embargo, no es posible en todos los contextos. Por ejemplo, no puede emitir solo un atributo porque se espera que el atributo se adjunte a un elemento:

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

Su pregunta real está más cerca de "¿es posible invocar una macro dentro de un atributo?". La respuesta parece ser no : el analizador no espera una macro expansión en esa ubicación. Quizás desee ver la generación de código o las macros de procedimiento, dependiendo de lo que esté tratando de hacer.