1. ホーム
  2. c++

[解決済み] #ifdef vs #if - コードの特定の部分のコンパイルを有効/無効にする方法として、どちらが良いか/安全か?

2022-08-04 07:32:51

質問

これはスタイルの問題かもしれませんが、私たちの開発チームにはちょっとした溝があり、この問題について何か考えをお持ちの方はいらっしゃらないかと思いました。

基本的に、私たちには通常の開発中にオフにするいくつかのデバッグ印刷ステートメントがあります。個人的には、次のようにするのが好きです。

//---- SomeSourceFile.cpp ----

#define DEBUG_ENABLED (0)

...

SomeFunction()
{
    int someVariable = 5;

#if(DEBUG_ENABLED)
    printf("Debugging: someVariable == %d", someVariable);
#endif
}

チームの中には、次のようなものを好む人もいます。

// #define DEBUG_ENABLED

...

SomeFunction()
{
    int someVariable = 5;

#ifdef DEBUG_ENABLED
    printf("Debugging: someVariable == %d", someVariable);
#endif
}

...どの方法が良いと思いますか、そしてそれはなぜですか?私の感覚では、常に何かが定義されており、他の場所の定義を破壊する危険性がないため、最初の方法がより安全だと思います。

どのように解決するのですか?

私の最初の反応は #ifdef 勿論 しかし、私は #if には実際にいくつかの重要な利点があると思います。

第一に、あなたは DEBUG_ENABLED をプリプロセッサーで でコンパイルされたテストです。例 - デバッグを有効にしたときのタイムアウトを長くしたいことがよくあるので、その場合は #if を使えば、次のように書くことができます。

  DoSomethingSlowWithTimeout(DEBUG_ENABLED? 5000 : 1000);

...の代わりに

#ifdef DEBUG_MODE
  DoSomethingSlowWithTimeout(5000);
#else
  DoSomethingSlowWithTimeout(1000);
#endif

第二に、もしあなたが #define からグローバル定数に移行する場合です。 #define は、ほとんどのC++プログラマに嫌われます。

そして3つ目は、チーム内に分裂があるとのことですね。これは、メンバーによってすでに異なるアプローチを採用しており、標準化する必要があることを意味していると思います。という裁定を下しました。 #if が望ましいということは #ifdef を使ったコードは DEBUG_ENABLED が偽であっても、コンパイル - 実行されます。そして、それは 大いに その逆よりも、そうでないときに生成されたデバッグ出力を追跡して削除する方がはるかに簡単です。

ああ、そして小さな読みやすさのポイント。0/1 ではなく、true/false を使用できるようにする必要があります。 #define そして、値は単一のレキシカルトークンなので、括弧で囲む必要がないのはこのときだけです。

#define DEBUG_ENABLED true

の代わりに

#define DEBUG_ENABLED (1)