[解決済み] #ifdef vs #if - コードの特定の部分のコンパイルを有効/無効にする方法として、どちらが良いか/安全か?
質問
これはスタイルの問題かもしれませんが、私たちの開発チームにはちょっとした溝があり、この問題について何か考えをお持ちの方はいらっしゃらないかと思いました。
基本的に、私たちには通常の開発中にオフにするいくつかのデバッグ印刷ステートメントがあります。個人的には、次のようにするのが好きです。
//---- 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)
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] 整数を2で割る場合、どちらがよいでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】"static const" vs "#define" vs "enum"