如何定义传递(标识或NOP)宏



当从另一种语言移植代码时,我想保留一些表达式,如likely/unlikely宏作为虚拟宏。

使用例子:

if expr_nop!(expression) { 
    code;
}

…它应该是就像这样写:

if (expression) { 
    code;
}

在rust中有什么好的故障安全宏可以用作no-op?

目前我有:

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

这是正确的还是应该写得不同?

我想说你的宏…

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

…是正确的。

它只做一件事:检查宏的实参是否确实是一个表达式。例如,expr_nop(i32)会给出一个编译时错误,因为i32是一个类型而不是表达式(这通常是一件好事,因为否则if expr_nop!(i32) {...}会给出一个编译时错误,而那个错误可能会更复杂)。

在这两种情况下,错误都是编译时的,但第一种情况是在宏展开之前(期间),第二种情况是在宏展开之后,这通常使得将错误链接到您试图编译的代码更加困难。

最新更新