首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写一个宏来显示文件和行号以及可变数量的参数?

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

Stack Overflow用户
提问于 2020-10-15 22:42:23
回答 1查看 341关注 0票数 3

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

代码语言:javascript
复制
macro_rules! print_all {
    ($($args:expr),*) => {{
        $(
            println!("{}", $args);
        )*
    }}
}

我的目标是以某种方式将所有这些宏组合在一个我将在故障排除/调试期间使用的宏中。因此,在下面的示例中调用trace!宏:

代码语言:javascript
复制
let a: i32 = 1;
let b: i32 = 2;
trace!(a,b)

应该扩展到类似这样的内容:

代码语言:javascript
复制
println!("TRACE: file: {}, line: {}, a: {}, b: {}", file!(), line!(), a, b);

有可能吗?如果是,这样的宏是如何工作的?

EN

回答 1

Stack Overflow用户

发布于 2020-10-15 23:02:20

你可以这样做:

代码语言:javascript
复制
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将其限制为单个系统调用,但这可能不值得您这么做。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64374095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档