调试宏
(所有这些都是不稳定的,因此只能在夜间编译器中使用。)
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 编译器 gcc
和 clang
中的 -E
标志。)