1. ホーム
  2. c++

C++のDEBUGマクロ

2023-09-09 03:38:47

質問

C言語のDEBUGマクロで、とても気に入ったものがあります。

#ifdef DEBUG_BUILD
#  define DEBUG(x) fprintf(stderr, x)
#else
#  define DEBUG(x) do {} while (0)
#endif

C++のアナログは:-になるんでしょうかね。

#ifdef DEBUG_BUILD
#  define DEBUG(x) cerr << x
#else
#  define DEBUG(x) do {} while (0)
#endif

  1. 2番目のコードスニペットは、C言語のものと類似していますか?
  2. お気に入りの C++ デバッグ マクロはありますか?

EDIT 。 Debug Macros" とは、デバッグモードでプログラムを実行しているときに便利なマクロを意味します"。

どのように解決するのですか?

2番目のコードスニペットは、C言語のものと類似していますか?

多かれ少なかれ。より強力です。 << -その一方で、人々が引数にセミコロンを含めることによってそれを悪用する可能性がわずかにあります。あるいは、呼び出しの後のセミコロンを忘れたことによるミスに遭遇することもある。だから、私はこれをdoブロックに含めることにします。

#define DEBUG(x) do { std::cerr << x; } while (0)

お気に入りのC++デバッグマクロはありますか?

私は上のものが好きで、よく使います。私の no-op は通常、次のように読み取ります。

#define DEBUG(x)

であり、最適化コンパイラでも同じ効果がある。ただし、以下の @Tony D のコメントは正しいです: これはいくつかの構文エラーを検出できないままにします。

私は時々、実行時のチェックも含めて、ある種のデバッグ フラグを提供します。Tony D が私に思い出させたように、そこに endl があることは、しばしば有用です。

#define DEBUG(x) do { \
  if (debugging_enabled) { std::cerr << x << std::endl; } \
} while (0)

また、式を表示したいこともあります。

#define DEBUG2(x) do { std::cerr << #x << ": " << x << std::endl; } while (0)

いくつかのマクロでは、私は __FILE__ , __LINE__ または __func__ などがありますが、これらはアサーションであることが多く、単純なデバッグマクロではありません。