3

g++ コンパイラを使用していますが、構成に応じて、C++ コードの特定の行をコメントアウトするか、コメントアウトしないようにします。

私はできることに気づきました:

#ifdef DEBUG
cout << "foo" << endl;
#endif

しかし、私はそれをすべて1行にまとめたいと思います:

#define DEBUG //
DEBUG cout << "foo" << endl;

...DEBUGのマクロである//. しかし、書いて#define DEBUG //も何も生まれません。誰が何をすべきか教えてもらえますか?

4

5 に答える 5

4

これを行う1つの方法は次のとおりです。

#ifdef DEBUG
#define DEBUG_LOG(x) std::cout << x << std::endl;
#else
#define DEBUG_LOG(x)
#endif

DEBUG_LOG("foo")
于 2012-09-29T19:39:10.960 に答える
3

しかし、私はそれをすべて1行にまとめたいと思います:
#define DEBUG //

人々はあなたが望むことを達成する方法の良い例を挙げていますが、あなたのアプローチがうまくいかなかった理由について誰もコメントしていません.

あなたのアプローチは決してうまくいきません。うまくいきません。プリプロセッサ シンボルが定義されるまでにコメントが存在しないという単純な理由から、コメント シーケンスの開始となるマクロを定義するメカニズムはありません。それらはすでに取り除かれています。

于 2012-09-29T20:28:14.840 に答える
2

ドブス博士の記事からの1つのトリック:

#if _DEBUG
// dbgInC defined as "printf" or other custom debug function
#define dbgInC printf
// dbgInCpp defined as "cout" or other custom debug class
#define dbgInCpp cout
#else
// dbgInC defined as null [1]
#define dbgInC
// dbgInCpp defined as "if(0) cerr" or "if(1); else cerr"
#define dbgInCpp if(0) cerr
#endif

これには、複数行のステートメントを許可できるという利点があります。

dbgInCpp << "Debug in C++: "
<< a // a is an integer
<< b /* b is char array */
<< c // c is a float
<< endl;
于 2012-09-29T19:39:51.247 に答える
0

Cでは慣用的ではありません。通常の形式を使用することをお勧めします。

#ifdef DEBUG
    count << "foo" << endl;
#endif

または(としてassert):

#ifndef NDEBUG
    count << "foo" << endl;
#endif

読みやすさのために。このコードをマクロにカプセル化することもできます。

#ifdef DEBUG
#define PRINT_DEBUG(s) cout << s << endl
#else
#define PRINT_DEBUG(s) (void)0
#endif
于 2012-09-29T19:38:58.223 に答える
0

あなたが持っているかもしれません

#ifndef NDEBUG
#define DBGOUT(Out) cout << __FILE__ << ":" << __LINE__ << ":" \
  << Out << endl
#else
#define DBGOUT(Out) do {} while(0)
#endif

コードで次のようなものを使用します

DBGOUT("x is " << x);

私はNDEBUGsymolを使用します。なぜなら、それ<assert.h><cassert>使用するからです。

于 2012-09-29T19:40:27.057 に答える