gpt4 book ai didi

rust - 如何编写一个宏来显示文件和行号以及可变数量的参数?

转载 作者:行者123 更新时间:2023-12-03 11:28:31 24 4
gpt4 key购买 nike

我在 Rust 中发现了几个有用的宏,即:file!(), line!(), stringify!()我还发现 Rust 允许带有可变参数的宏,如 here 所述:

macro_rules! print_all {
($($args:expr),*) => {{
$(
println!("{}", $args);
)*
}}
}
我的目标是以某种方式将所有这些宏组合到一个我将在故障排除/调试期间使用的宏中。所以打电话 trace!以下示例中的宏:
let a: i32 = 1;
let b: i32 = 2;
trace!(a,b)
应该扩展到这样的:
println!("TRACE: file: {}, line: {}, a: {}, b: {}", file!(), line!(), a, b);
是否可以?如果是,这样的宏将如何工作?

最佳答案

你可以这样做:

macro_rules! trace {
($($args: expr),*) => {
print!("TRACE: file: {}, line: {}", file!(), line!());
$(
print!(", {}: {}", stringify!($args), $args);
)*
println!(""); // to get a new line at the end
}
}
调用 print! 的开销可能很小多次,因为每次调用都会导致系统调用并且还会检查 IO 错误。但是,为任意参数构造单个格式字符串需要一个过程宏,我认为这超出了问题的范围。
您也可以使用 BufWriter将其限制为单个系统调用,但这可能不值得付出努力。

关于rust - 如何编写一个宏来显示文件和行号以及可变数量的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64374095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com