我正在尝试创建一个crash!基本上只是包装的自定义宏eprintln!,但它可以是任何其他format!类似的宏。目前看起来是这样的。
macro_rules! crash {
($fmt_str:literal, $($args:expr),*) => {{
eprintln!($fmt_str, $args);
std::process::exit(1);
}};
}
Run Code Online (Sandbox Code Playgroud)
我无法$args直接使用,因为它仍在重复,所以我需要某种方法将其分开,但我不知道该怎么做。
当您的解决方案有效时,转发宏参数的最佳方法是将它们捕获为tt. 就您而言,由于您想要的只是转发它们,因此您可以使用$($t:tt)*:
macro_rules! crash {
($($t:tt)*) => {{
eprintln!($($t)*);
std::process::exit(1);
}};
}
Run Code Online (Sandbox Code Playgroud)
这样做的优点是完全透明,并且可以启用底层宏启用的所有功能。例如,在这种情况下,该tt版本支持早期扩展的格式字符串,而您的原始版本不支持(playground):
// crash!(concat!("a", "b")); // Does not compile
crash_tt!(concat!("a", "b"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1414 次 |
| 最近记录: |