Macros 如何在宏中设置编译时条件
我想在宏生成函数外的代码时,在宏中设置编译时条件。我需要这样的东西: 或者类似的事情:Macros 如何在宏中设置编译时条件,macros,rust,Macros,Rust,我想在宏生成函数外的代码时,在宏中设置编译时条件。我需要这样的东西: 或者类似的事情: 当前的Rust宏状态是否可能?您所要求的是不可能的。谢天谢地,你所要求的和你的例子表明你想要的是两件不同的事情: macro_rules! cond { ("i32") => { struct A { x: i32, } }; ($el:expr) => { struct B {
当前的Rust宏状态是否可能?您所要求的是不可能的。谢天谢地,你所要求的和你的例子表明你想要的是两件不同的事情:
macro_rules! cond {
("i32") => {
struct A {
x: i32,
}
};
($el:expr) => {
struct B {
x: f64
}
};
}
cond!("i32");
cond!("f64");
fn main() {}
但是,从字面上理解您的问题:不,没有办法对宏中的条件进行任何类型的复杂测试,宏也不能设置或测试传递给它们的内容之外的任何类型的状态。您可以对宏的直接输入进行文字匹配,或者您可以将某些输入解析为有限数量的语法构造之一(然后您就无法进行匹配),仅此而已。如果宏不足,则始终会有
build.rs
和过程宏。谢谢您的回答!你让我有了一些想法。
macro_rules! cond {
( $cond_el:expr ) => {
match $cond_el {
"i32" => {
struct A {
x: i32
}
}
_ => {
struct A {
x: f64
}
}
}
}
}
cond!("i32");
cond!("f64");
fn main() {}
macro_rules! cond {
("i32") => {
struct A {
x: i32,
}
};
($el:expr) => {
struct B {
x: f64
}
};
}
cond!("i32");
cond!("f64");
fn main() {}