Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何编写显示文件和行号以及可变参数数的宏?_Rust_Rust Macros_Rust Decl Macros - Fatal编程技术网

Rust 如何编写显示文件和行号以及可变参数数的宏?

Rust 如何编写显示文件和行号以及可变参数数的宏?,rust,rust-macros,rust-decl-macros,Rust,Rust Macros,Rust Decl Macros,我在Rust中发现了几个有用的宏,即:file!(),线路!(),收紧!()我还发现Rust允许宏使用可变参数,如下所述: 我的目标是以某种方式将所有这些宏合并到一个宏中,我将在故障排除/调试期间使用这些宏。所以调用trace宏: let a: i32 = 1; let b: i32 = 2; trace!(a,b) 应该扩展到如下内容: println!("TRACE: file: {}, line: {}, a: {}, b: {}", file!(), line!()

我在Rust中发现了几个有用的宏,即:
file!(),线路!(),收紧!()
我还发现Rust允许宏使用可变参数,如下所述:

我的目标是以某种方式将所有这些宏合并到一个宏中,我将在故障排除/调试期间使用这些宏。所以调用
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
    }
}

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

您可以这样做:

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
将其限制为单个系统调用,但这可能不值得付出努力。

不想激发创造力,但这看起来与标准宏非常相似(问它如何工作仍然是一个有效的问题)