私は__noopについて読んでいましたが、MSDN の例は次のとおりです。
#if DEBUG
#define PRINT printf_s
#else
#define PRINT __noop
#endif
int main() {
PRINT("\nhello\n");
}
空のマクロを使用するだけでは得られません。
#define PRINT
生成されるコードは同じです。__noop
実際に役立つ有効な使用例は何ですか?
私は__noopについて読んでいましたが、MSDN の例は次のとおりです。
#if DEBUG
#define PRINT printf_s
#else
#define PRINT __noop
#endif
int main() {
PRINT("\nhello\n");
}
空のマクロを使用するだけでは得られません。
#define PRINT
生成されるコードは同じです。__noop
実際に役立つ有効な使用例は何ですか?
__noop
組み込み関数は、関数を無視し、引数リストを解析する必要があるが、引数のコードは生成されないことを指定します。これは、可変数の引数を取るグローバルデバッグ関数での使用を目的としています。
あなたの場合、議論は明らかに副作用のない表現であり、簡単に最適化できるので、問題ではありません。
ただし、引数式に副作用がある場合や、コンパイラが正常に終了して副作用がないことをコンパイラが証明できないほど複雑な場合は、を使用__noop
すると、その式の潜在的にコストのかかる評価を防ぐことができます。
2番目の利点は、構文的に可変数の引数を持つ関数呼び出しのように動作することです。したがって、関数呼び出しの代わりに使用しても、プログラムの解析には影響しません。他のいくつかの置換(空の文字列など)では、状況によっては問題になる可能性があります。
#define PRINT
extern int some_complicated_calculation();
PRINT("%d\n", some_complicated_calculation());
結果が必要ない場合でも、関数を呼び出します。
を使用する__noop
と、関数は呼び出されません。
PRINT
引数を無視するように定義できます (コンパイラが可変長マクロをサポートしていると仮定します) 。しかし、それらはまったく解析されず、PRINT
何かを行うように定義されたバリアントをコンパイルせずにそれらの周りのコードを変更すると無効になる可能性があります。を使用する__noop
と、引数は引き続き解析されるため、有効なままである可能性が高くなります。