如何在宏中设置编译时条件

Lod*_*din 2 macros rust

我想在函数外部生成代码时在宏中设置编译时条件.我需要这样的东西:

macro_rules! cond {
    ( $cond_el:expr ) => {
         #[if $cond_el == "i32"]
             struct A {
                 x: i32
             }
         #[else]
             struct A {
                 x: f64
             }
    }
}

cond!("i32");
cond!("f64");

fn main() {}
Run Code Online (Sandbox Code Playgroud)

或者类似的东西:

macro_rules! cond {
    ( $cond_el:expr ) => {
         match $cond_el {
            "i32" => {
                struct A {
                   x: i32
                }
            }
            _ => {
                struct A {
                    x: f64
                }
            }
        }
    }
}

cond!("i32");
cond!("f64");

fn main() {}
Run Code Online (Sandbox Code Playgroud)

是否可以使用当前的Rust宏状态?

DK.*_*DK. 7

你所要求的是不可能的.值得庆幸的是,您要求的内容以及您的示例建议您想要的是两件不同的事情:

macro_rules! cond {
    ("i32") => {
        struct A {
            x: i32,
        }
    };
    ($el:expr) => {
        struct B {
            x: f64
        }
    };
}

cond!("i32");
cond!("f64");

fn main() {}
Run Code Online (Sandbox Code Playgroud)

然而,从字面上理解你的问题:不,没有办法在宏中对条件进行任何形式的复杂测试,宏也不能设置或测试传递给它们的任何类型的状态.您可以对宏的直接输入进行文字匹配,或者您可以将某些输入解析为有限数量的语法结构之一(然后您无法匹配),这就是它.