#ifdef と #if - コードの特定のセクションのコンパイルを有効/無効にする方法として、どちらが優れている/安全ですか?

私の最初の反応は #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"