Создать значение атрибута с помощью макроса - PullRequest
1 голос
/ 27 апреля 2020

Предположим, у меня есть ident входной параметр с именем module_name. Как я могу сгенерировать значение атрибута через этот параметр?

Проще говоря, я хочу сгенерировать что-то вроде этого:

macro_rules! import_mod {
    ( $module_name:ident ) => {
        // This does not work,
        // but I want to generate the value of the feature attribute.
        // #[cfg(feature = $module_name)]
        pub mod $module_name;
    }
}

import_mod!(module1);

// #[cfg(feature = "module1")]
// pub mod module1;

1 Ответ

1 голос
/ 27 апреля 2020

Аргумент в директиве компилятора должен быть литералом.

Половина достойного обходного пути состоит в том, чтобы взять как литерал, так и вашу функцию:

macro_rules! my_import {
    ( $module_name:ident, $feature_name:literal ) => {
        #[cfg(feature = $feature_name)]
        mod $module_name;
    }
}

my_import!(foo, "foo");

Для справки - https://doc.rust-lang.org/stable/reference/attributes.html#meta -item-attribute-синтаксис

Подводя итог: большинство встроенных атрибутов имеют правило #[<attribute> = <literal>]

...