9

マクロが定義されていて、if else ステートメント内でそのマクロを使用しているとします。

#include <iostream>

#define LOG(x) {if (x) std::cout << "What is up" << std::endl;}

int main(void) {
  if (true)
    LOG(true);
  else
    false;
  return 0;
}

さて、これはトリッキーなケースです。インデントによっては、「if」と「else」のどちらを使用するべきかについてあいまいさが生じる可能性があることに気付きました。

私はこの魂を思いついた

(some_condition) ? dosomething() : true;

これで問題は解決しますが、真のステートメントを持つことの影響が何であるかはわかりません。これは良い解決策ですか、それともより良いアプローチがありますか?

編集:ここに私が使用したコードがありますが、動作しません。これを修正できるかどうか確認してください。

4

6 に答える 6

1

できるよ:

#define LOG(X) ((some_condition) && dosomething())

ここでは、 の遅延評価を使用しています。&&右の部分は、some_conditionが true の場合にのみ評価されます。

警告:dosomething()が返されないvoid場合があり、返される内容によっては、 でコンパイラの警告が表示されないようにキャストする必要がある場合があります&&

一方、 を使用したソリューション? :は非常に優れています。ランダムな値を持つ式を持つことにまったく問題はありません(trueあなたの場合)。コンパイラはこれを適切に最適化します。

于 2013-08-08T15:24:25.170 に答える