私の最初の反応は #ifdef
でした もちろん 、でも #if
だと思います これには実際にいくつかの重要な利点があります。その理由は次のとおりです:
まず、 DEBUG_ENABLED
を使用できます プリプロセッサ および コンパイルされたテスト。例 - 多くの場合、デバッグが有効になっているときにタイムアウトを長くしたいので、 #if
を使用します 、私はこれを書くことができます
DoSomethingSlowWithTimeout(DEBUG_ENABLED? 5000 : 1000);
...代わりに...
#ifdef DEBUG_MODE
DoSomethingSlowWithTimeout(5000);
#else
DoSomethingSlowWithTimeout(1000);
#endif
第二に、#define
から移行したい場合は、より有利な立場にいます。 グローバル定数に。 #define
s は通常、ほとんどの C++ プログラマーに嫌われます。
第三に、あなたは自分のチームに分断があると言っています。私の推測では、これは、さまざまなメンバーがすでにさまざまなアプローチを採用しており、標準化する必要があることを意味します。 #if
という裁定 は、コードが #ifdef
を使用していることを意味します。 DEBUG_ENABLED
の場合でもコンパイルおよび実行されます は偽です。 たくさん 生成されるべきではないときに生成されたデバッグ出力を追跡して削除する方が、その逆よりも簡単です。
ああ、そしてマイナーな読みやすさのポイント。 #define
では 0/1 ではなく true/false を使用できるはずです 、そして値は単一のレキシカル トークンであるため、その前後に括弧が必要ないのは 1 回だけです。
#define DEBUG_ENABLED true
の代わりに
#define DEBUG_ENABLED (1)
彼らは両方とも恐ろしいです。代わりに、次のようにします:
#ifdef DEBUG
#define D(x) do { x } while(0)
#else
#define D(x) do { } while(0)
#endif
次に、デバッグ コードが必要なときはいつでも、D();
内に配置します。 .そしてあなたのプログラムは #ifdef
の恐ろしい迷路で汚染されていません .
#ifdef
指定されたトークンが定義されているかどうかを確認するだけです
#define FOO 0
それから
#ifdef FOO // is true
#if FOO // is false, because it evaluates to "#if 0"