2

デバッグ モードでのみ「アクティブ」なコード行をいくつか用意し、リリース モードでは無視する必要があります。このようなことをする方法はありますか:

#include <iostream>
using namespace std;

#ifdef _TEST_
#define _cerr cerr
#else
#define _cerr // cerr
#endif

int main() {
   _cerr << "TEST message" << endl;
}

が定義されていない場合_TEST_、一部の行がコメント化されるか、コードから削除されます。コメントは残りの部分よりも先に処理されることを知っているので、このコードは間違っています。しかし、#ifdefs を明示的に使用せずに、必要な動作を取得するにはどうすればよいでしょうか?

4

10 に答える 10

9

これにはマクロを使用できます。

#ifdef _TEST_
#define DEBUG_ONLY(x) x;
#else
#define DEBUG_ONLY(x)
#endif

int main() {
    DEBUG_ONLY(cerr << "TEST message" << endl)
}
于 2009-11-03T12:42:45.960 に答える
5

リリースビルドで削除されたデバッグログが必要な場合は、次のようなことができます:

#ifdef _TEST_
#define LOG(x) (cerr << x << endl)
#else
#define LOG(x)
#endif

...

int main() {
    LOG("TEST message");
}
于 2009-11-03T12:48:05.777 に答える
4

これを使って:

#ifdef _TEST_
#define DEBUG_TEST(x) x
#else
#define DEBUG_TEST(x)
#endif

int main() {
    DEBUG_TEST(_cerr << "TEST message" << endl);
}
于 2009-11-03T12:43:14.367 に答える
2

ifdefs は行く方法です。コンパイラがリリース モードかデバッグ モードかを他にどのように知ることができますか? 前処理段階以外にいつそれが伝えられますか? 他にどの段階でコードを削除/追加するかを決定できます (テンプレートの生成時以外)。テンプレート生成を使用できるかもしれませんが、テンプレートを制御するには、何らかの方法で ifdef をオフにする必要があります。

たぶん、私が考えていないこれを行うための非常に巧妙な方法があるかもしれませんが、誰もがこの目的のために ifdefs を知っている/使用しています。それらに変化球を投げると、コードを維持するための人的コストが大幅に増加するだけです。

ifdefs に固執します。

于 2009-11-03T12:41:55.760 に答える
1

これは基本的にあなたが求めていることを行います:

#ifdef _TEST_
#define _cerr  cerr
#else
#define _cerr  if (1) {} else cerr
#endif

elseただし、たとえば、次のように記述した場合にあいまいに関するコンパイラの警告が表示されても驚かないでください。

if (something)
  _cerr << "Why?" << std::endl;

_cerrこれは実際には重要なマクロであるという事実を常に認識しておく必要があります。

于 2009-11-03T12:47:26.693 に答える
1

_cerr を何も定義しないと、コンパイルに失敗します。代わりに、リリース モードで除外するマクロを定義できます。

例えば:

#ifdef _TEST_
#define LOG_ERROR(log) cerr << log << endl;
#else
#define LOG_ERROR(log) 
#endif

次に、コードで:

int main() {
   LOG_ERROR("TEST message");
}
于 2009-11-03T12:47:54.013 に答える
0

「ログインなしのリリース」のより良い解決策は、次のクラスです。

class NullStream {
   template<typename T> NullStream& operator<< const(T&) { }
};

使用する:

#ifdef DEBUG
#define CERR std::cerr
#else
#define CERR NullStream()
#endif
于 2009-11-03T13:44:31.030 に答える
0
int main() {
#ifdef _TEST_
   _cerr << "TEST message" << endl;
#endif
}
于 2009-11-03T12:43:02.100 に答える
0

いいえ、まったくありません。

これのバリエーションを試してください:

#ifdef _TEST_
    ostream& _cerr = cerr;
#else
    ostringstream _cerr;
#endif

(基本的には、入力を破棄するだけのストリームが必要です。)

于 2009-11-03T12:43:19.790 に答える
0

独自の NULL ストリームを作成します。

#include <iostream>

class NullStream    {};
template<typename T>
NullStream& operator <<(NullStream& n,T const& data)                        {return n;}
NullStream& operator <<(NullStream& n,std::ostream& (*)(std::ostream&))     {return n;}

#ifdef  _TEST_
#define myerr       std::cerr
#else
NullStream  myerrstream;
#define myerr       myerrstream
#endif

int main()
{
    myerr << "Hi" << std::endl;;
    myerr << std::endl;;
}
于 2009-11-03T17:35:11.563 に答える