web-dev-qa-db-ja.com

条件付きコンパイルのショートカットとしてC / C ++マクロを使用することは良い習慣ですか?

コードにいくつかのタイプの出力メッセージを含めたいとしましょう。それらの1つはDEBUGで、コードがデバッグモードでコンパイルされたときにのみ表示されます。

通常私は次のようなものを書かなければならないでしょう

#ifdef DEBUG
    std::cout << "Debug message" << std::endl;
#endif

これは、多くの場所で使用するのはかなり面倒で迷惑です。

コードスニペットのマクロを定義することは良い習慣なので、このように使用しますか?

MSG_DEBUG("Debug message")

または、マクロなしでそれに対処する他のよりエレガントな方法はありますか?異なるプロジェクトで両方の言語を使用しているため、CとC++の両方で可能な解決策に興味があります。

13
Eenoku

もちろん、そもそもマクロの使用に問題がなければ、同じ条件コードを繰り返し続けるのではなく、パラメーター化されたマクロを定義することは、適切なコーディングの手段としては確かに望ましいことです。

マクロを使用する必要がありますか?私の見解では、それはCで認められている慣行であり、マクロなしのソリューションでは少なくともsomethingがデバッグモード以外でも実行される必要があるためです。一般的なCプログラマーは、不必要な実行時の作業よりも少し醜いマクロをいつでも選択します。

19
Kilian Foth

ここには個人的な好みの要素がありますが、C++ではヘッダーファイルでこれを行うことを好みます。

#ifdef _DEBUG
    void DebugMessage(...);
#else
    inline void DebugMessage(...) {}
#endif

そのため、関数はリリースビルドでインライン化されますが、デバッグビルドでは適切な関数であるため、適切な型チェック、実用的なエラーメッセージなどを取得し、後でさらに機能を追加できます(おそらくログに記録しますか?)。

明らかに、対応する関数の定義を.cppファイルの#ifdef _DEBUGブロックに含める必要もあります。

13
Jack Aidley

間違いなく、チームから与えられたコードのガイドラインを踏まないようにしてください。システム内の他のコードが一般的なif条件を介して同じ機能に到達しようとしないことを確認してください。

2
James O