0

make ファイルからプログラムをデバッグする方法を設定する必要があります。具体的には、入力するときにmake -B FLAG=-DNDEBUGプログラムを正常に実行する必要があります。しかし、このフラグが存在しない場合assert()、コード全体でいくつかのコマンドを実行する必要があります。

明確にするために、このフラグが私の C コード内に存在しないかどうかを確認する方法を知る必要が#ifndefあります。

私の無知を許してください、どんな反応でも大歓迎です!

4

2 に答える 2

0

"FLAG=-DNDEBUG" を指定してまたは指定せずに make を呼び出す場合、Makefile に次のような規則が必要になります。

%.o: %.c gcc -c $(FLAG) $<

C コードでは、次のようなものが必要になります。

#ifndef NDEBUG
  fprintf(stderr, "My trace message\n");
#endif
于 2015-10-15T06:07:09.910 に答える
0

標準ライブラリ ( d in ) のassertマクロについて話していると仮定すると、何もする必要はありません。ライブラリはすでにフラグを処理しています。#define<assert.h>NDEBUG

マクロが / ではない場合にのみ独自のコードを実行させたい場合は、質問ですでに疑っている#defineように an を使用してください。#ifdef

たとえば、条件が複雑すぎて 1 つのassert式にまとめられない場合があるため、変数が必要です。しかし、assertが何も展開されない場合、その値を計算する必要はありません。したがって、このようなものを使用できます。

int
questionable(const int * numbers, size_t length)
{
#ifndef NDEBUG
  /* Assert that the numbers are not all the same. */
  int min = INT_MAX;
  int max = INT_MIN;
  size_t i;
  for (i = 0; i < length; ++i)
    {
      if (numbers[i] < min)
        min = numbers[i];
      if (numbers[i] > max)
        max = numbers[i];
    }
  assert(length >= 2);
  assert(max > min);
#endif
  /* Now do what you're supposed to do with the numbers... */
  return 0;
}

このコーディング スタイルはコードを読みにくくし、デバッグが非常に困難なHeisenbugsを要求していることに注意してください。これを表現するより良い方法は、関数を使用することです。

/* 1st helper function */
static int
minimum(const int * numbers, size_t length)
{
  int min = INT_MAX;
  size_t i;
  for (i = 0; i < length; ++i)
    {
      if (numbers[i] < min)
        min = numbers[i];
    }
  return min;
}

/* 2nd helper function */
static int
maximum(const int * numbers, size_t length)
{
  int max = INT_MIN;
  size_t i;
  for (i = 0; i < length; ++i)
    {
      if (numbers[i] > max)
        max = numbers[i];
    }
  return max;
}

/* your actual function */
int
better(const int * numbers, int length)
{
  /* no nasty `#ifdef`s */
  assert(length >= 2);
  assert(minimum(numbers, length) < maximum(numbers, length));
  /* Now do what you're supposed to do with the numbers... */
  return 0;
}
于 2015-10-15T06:13:10.503 に答える