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


13

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

通常私は

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

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

コードスニペットのマクロを定義することをお勧めします。このように使用しますか?

MSG_DEBUG("Debug message")

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



なぜ条件付きコードを関数に入れてそれを呼び出さないのかという質問からは明らかではありません。それを防ぐ他の制約はありますか?
アレックス

@gnatあなたが言及した質問は非常に広範であるため、特にインターネットでこの特定の質問を見ている場合、ほとんどの人はこのトピックに接続しません。
Eenoku

3
あなたの質問はcc ++の両方でタグ付けされていますが、これらはかなり異なる言語です。あなたが話しているものを明確にできますか?あなたの例はCでは完全に問題ありませんがconstexpr if、たとえばC ++ではより良く実装されるかもしれません。
ヨルグWミットタグ

1
余談ですが、診断はに進む必要がありSTDERRます。また、なぜそれが依存しないNDEBUGようにassert()代わりのですか?次に#define DEBUG_MSG(MSG) assert(std::cerr << MSG)、のように定義して、ストリーム状態もテストできます。
デュプリケータ

回答:


19

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

マクロを使用する必要がありますか?私の見解では、Cでの慣習が受け入れられており、マクロなしのソリューションではデバッグモード以外でも少なくとも何かを実行する必要があるため、あなたはすべきです。典型的なCプログラマは、不必要な実行時の努力よりも少しslightlyいマクロをいつでも選択します。


13

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

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

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

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


しかし、ここにはまだ呼び出しのオーバーヘッドがありますよね?
Eenoku

7
コンパイラがリリースビルドで既知の空の関数を呼び出すコードを生成する場合、効率を改善するために最初に行う必要がある最大のことは、はるかに優れたコンパイラを取得することです。これは本当に簡単な最適化です。
デビッドソーン

@Eenokuいいえ、デビッドが言っているように、使用すべきコンパイラーによって削除されます。
ジャックエイドリー

3
ここには重要な違いがあります:マクロは(記述方法に応じて)引数式を評価しませんが、関数は常に評価します。また、重要でない引数をvarargs関数に渡すことは未定義の動作です(通常、コンパイラーの警告をトリガーします)。
セバスチャンレッド


2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.