宏自身文档测试中出现“找不到宏”错误

16

我正在尝试为我导出的 Rust 宏添加文档测试。就像这样:

/// Usage:
///
/// ```
/// let x = addone!(100);
/// ```
#[macro_export]
macro_rules! addone {
    ($x:expr) => ($x + 1)
}

如果我在这上面运行cargo test,我会得到

failures:

---- src/lib.rs - addone (line 3) stdout ----
    error: cannot find macro `addone!` in this scope
 --> src/lib.rs:2:9
  |
2 | let x = addone!(100);
  |         ^^^^^^

我想不出在文档测试中添加macro_use的合法方法,所以没有机会。

Rust标准库中的宏遵循与上述代码相同的格式,所以我本来期望它可以工作。

1个回答

20

如果文档测试在代码中找不到extern crate foo; fn main() { … }这些元素,它们会自动将代码块包裹在其中,但要获取导出的宏,您需要在extern crate foo;上使用#[macro_use]属性。

因此,您应该写成:

/// Usage:
///
/// ```
/// # #[macro_use] extern crate foo; fn main() {
/// let x = addone!(100);
/// # }
/// ```
#[macro_export]
macro_rules! addone {
    ($x:expr) => ($x + 1)
}

(以下以 开头的行在输出中被隐藏,但是在编译文档测试所需的代码中包含,不带标记。)

详情请参考The Rust Programming Language第一版中的相关章节

至于std,对于没有#![no_std]属性的所有crate来说,都隐含着#[macro_use] extern crate std;,所以它的宏可以立即使用。


完美运行。谢谢! - Gustav Larsson
我们在最新版本的Rust中有更好的解决方案吗? - Bryan Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接