2016-08-12 2 views
4

他の言語のコードを移植するときに、likely/unlikelyというマクロをダミーのマクロとして保持したいと考えています。パススルー(IDまたはNOP)マクロを定義する方法は?

使用例:書き込みなど正確同じでなければなりません

if expr_nop!(expression) { 
    code; 
} 

...:

if (expression) { 
    code; 
} 

いただきましとして使用することができますさびでは良いフェイルセーフマクロいいえ?

現在、私が持っている:

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

は、この正しいですかこれは、異なる記述する必要がありますか?

+3

アイデンティティ関数の類推によって、この 'identity macro'を呼び出すほうが良いのですか?私の意見の中で「ノー・オペ」は、文字通り何もせず、表現をそのまま残すことを意味していません。 – deniss

+0

@deniss、あなたはおそらく、この用語に新しいです。 – ideasman42

+0

あなたの元の問題に関連しています:[可能性が高い/内在しない本質的な実装](https://github.com/rust-lang/rust/issues/26179)。 – Shepmaster

答えて

2

私はあなたのマクロ...

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

...が正しいと思います。

しかし、1つのことをします。マクロへの引数が実際に式であることを確認します。だからexpr_nop(i32)は、i32が型であり式ではないのでコンパイル時エラーを出すでしょう。そうでなければif expr_nop!(i32) {...}はコンパイル時エラーを返し、そのエラーはより複雑になる可能性があるからです。

エラーはどちらの場合でもコンパイル時に発生しますが、マクロ展開前の(マクロ展開時の)最初のケースで、マクロ展開後の2番目のケースでは、エラーをコードにリンクするのが難しくなることがありますコンパイルしようとしています。

関連する問題