调试宏

(所有这些都是不稳定的,因此只能在夜间编译器中使用。)

log_syntax!()

#![`feature(log_syntax)`]

macro_rules! logged_sum {
    ($base:expr) => { 
        { log_syntax!(base = $base); $base } 
    };
    ($a:expr, $($rest:expr),+) => { 
        { log_syntax!(a = $a, rest = $($rest),+); $a + logged_sum!($($rest),+) } 
    };
}

const V: u32 = logged_sum!(1, 2, 3);

在编译期间,它会将以下内容打印到 stdout:

a = 1,rest = 2,3a
= 2,rest = 3
base = 3

- 扩展了

运行编译器:

rustc -Z unstable-options --pretty expanded filename.rs

这将扩展所有宏,然后将扩展结果打印到 stdout,例如上面可能会输出:

#![`feature(prelude_import)`]
#![no_std]
#![`feature(log_syntax)`]
#[prelude_import]
use std::prelude::v1::*;
#[macro_use]
extern crate std as std;


const V: u32 = { false; 1 + { false; 2 + { false; 3 } } };

(这类似于 C 编译器 gccclang 中的 -E 标志。)