1

私が理解していることから、assertはCのマクロであり、コンパイル時に使用するが無効のままにすると、オーバーヘッドは発生しません(正しくない可能性があります)。私にとっての問題は、すべての変数を関数に渡してその出力を出力することですが、デバッグを有効にする場合に限ります。これが私がこれまでに持っているものです:

int exampleFunction (int a, int b)
{
  #ifdef debugmode
  printf("a = %i, b = %i", a, b);
  #endif 
}

このようなことをするためのもっと簡単な(そして醜い)方法があるかどうか疑問に思います。xdebug for phpにはこの機能があり、デバッグ時に非常に時間を節約できることがわかったので、関数ごとに実行したいと思います。

ありがとう

4

7 に答える 7

11

これを試して:

#ifdef debugmode
#define DEBUG(cmd) cmd
#else
#define DEBUG(cmd)
#endif


DEBUG(printf("a = %i, b = %i", a, b));

ここで、debugmode定義した場合は、print ステートメントを取得します。そうしないと、バイナリに表示されません。

于 2009-06-17T18:50:17.177 に答える
3

GCCを使用して、ファイルごとに追加するのが本当に楽しいです:

#if 0
#define TRACE(pattern,args...)   fprintf(stderr,"%s:%s/%u" pattern "\n",__FILE__,__FUNCTION__,__LINE__,##args)
#else
#define TRACE(dummy,args...)
#endif

そしてコードで:

i++;
TRACE("i=%d",i);

iファイルの先頭にある TRACE() マクロをアクティブにした場合にのみ出力されます。非常にうまく機能し、ソースファイル、行、および発生した関数を出力します。

于 2009-06-17T19:01:59.123 に答える
1
if (MY_DEBUG_DEFINE) {
        do_debug_stuff();
}

まともなコンパイラは、ブロックを最適化して削除します。MY_DEBUG_DEFINEブール値 (0 または 0 以外) として定義する必要があることに注意してください。

#define MY_DEBUG_DEFINE defined(NDEBUG)

たまたま最大の警告レベルでコンパイルした場合、このトリックにより未参照の引数が回避されます。

于 2009-06-17T18:55:55.640 に答える
0

さて、ここで示した PRINT_DEBUG タイプのマクロの問題は、1 つのパラメーターしか使用できないことです。適切な printf() にはいくつか必要ですが、C マクロは (現在) 可変引数を許可していません。

したがって、これを実現するには、創造性を発揮する必要があります。

#ifdef debugmode
     #define PRINTF   printf
#else
     #define PRINTF    1 ? NULL : printf
#endif

PRINTF("a = %i, b = %i", a, b);次に、非デバッグ モードでを書き込むと、(効果的に) 次のようにレンダリングされます。

 if (true) NULL;
 else printf("a = %i, b = %i", a, b);

コンパイラは満足していますが、printf は実行されません。コンパイラが明るい場合 (つまり、最新の C コンパイラ)、printf() のコードは決して生成されません。 .

ただし、パラメーターは引き続き評価されるため、副作用 (つまり、++x または関数呼び出し) がある場合、コードが生成される可能性があることに注意してください (ただし、実行されません)。

于 2009-06-17T19:04:23.940 に答える
0

問題の追跡に役立つその他の C プリプロセッサ フラグも出力します。

printf("%s:%d {a=%i, b=%i}\n", __FILE__, __LINE__, a, b);
于 2009-07-17T15:45:50.283 に答える
0

PRINTF_IF_DEBUGGING を次のように定義できます。

#ifndef NDEBUG
#define PRINTF_IF_DEBUGGING(X) printf(X)
#else
#define PRINTF_IF_DEBUGGING(X)
#endif

これにより、#ifdef が 1 か所だけに集中化されます。

于 2009-06-17T18:51:31.607 に答える