如何定义传递(身份或NOP)宏?

时间:2016-08-12 06:39:24

标签: macros rust

从其他语言移植代码时,我想将likely / unlikely宏等一些表达式保留为虚拟宏。

使用示例:

if expr_nop!(expression) { 
    code;
}

... 完全相同与写作相同:

if (expression) { 
    code;
}

什么是生锈中可以用作无操作的良好故障安全宏?

目前我有:

macro_rules! expr_nop { ($body:expr) => { $body } }

这是正确的还是应该以不同的方式写出来?

1 个答案:

答案 0 :(得分:2)

我说你的宏......

macro_rules! expr_nop { ($body:expr) => { $body } }

......是对的。

它做了一件事:它检查宏的参数实际上是一个表达式。所以例如expr_nop(i32)会产生编译时错误,因为i32是一个类型而不是表达式(这通常是一件好事,因为否则if expr_nop!(i32) {...}会产生编译时错误,并且该错误可能是更复杂)。

错误在两种情况下都是编译时,但是在宏扩展之前的第一种情况和宏扩展之后的第二种情况下,这通常会使错误链接到你的代码更加困难试图编译。