2016-08-12 46 views
4

從另一種語言移植代碼時,我想保留一些表達式,例如likely/unlikely宏作爲虛擬宏。如何定義傳遞(身份或NOP)宏?

用法示例:

if expr_nop!(expression) { 
    code; 
} 

...這應該是正好一樣寫:

if (expression) { 
    code; 
} 

什麼在生鏽了良好的故障安全宏可以作爲一個無操作?

目前我有:

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

這是正確的還是這應該不同寫的?

+3

與身份函數相比,稱這個「身份宏」不是更好嗎?在我看來,「無操作」代表從字面上看沒有做任何事情,不是因爲離開表達。 – deniss

+0

@deniss,你可能是對的,對這個術語來說是新的。 – ideasman42

+0

與您的原始問題相關:[實施可能/不可能的內在](https://github.com/rust-lang/rust/issues/26179)。 – Shepmaster

回答

2

我說你的宏...

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

...是正確的。

它做了一件事:它檢查宏的參數實際上是一個表達式。所以例如expr_nop(i32)會給編譯時錯誤,因爲i32是一個類型而不是表達式(這通常是件好事,否則if expr_nop!(i32) {...}會給出編譯時錯誤,而錯誤可能會更復雜)。

這兩種情況下的錯誤都是編譯時間,但是在宏擴展之前(在)期間的第一種情況和在宏擴展之後的第二種情況下,這通常使得將錯誤與代碼鏈接起來更加困難正在嘗試編譯。