当从另一种语言移植代码时,我想保留一些表达式,如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) {...}
会给出一个编译时错误,而那个错误可能会更复杂)。
在这两种情况下,错误都是编译时的,但第一种情况是在宏展开之前(期间),第二种情况是在宏展开之后,这通常使得将错误链接到您试图编译的代码更加困难。