debugging 在C中使用makefile标志进行调试

prdp8dxp  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(144)

我需要设置一种方法从make文件调试我的程序。具体来说,当我输入make -B FLAG=-DNDEBUG时,我需要程序正常运行。但当这个标志不存在时,我需要在代码中运行一些assert()命令。
为了澄清,我需要知道如何检查这个标志是否在我的C代码中不存在,我假设它与#ifndef有关,我只是不知道从那里去哪里。
请原谅我的无知,任何回应都将不胜感激!

ecfdbz9o

ecfdbz9o1#

假设你正在谈论来自标准库的assert宏(<assert.h>中的#define d),那么你不必做任何事情。库已经处理了NDEBUG标志。
如果你想让你自己的代码只在宏是/不是#define d的情况下执行操作,那么就使用一个#ifdef,就像你在问题中已经怀疑的那样。
例如,我们可能有一个条件太复杂,无法放入单个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;
}
uajslkp6

uajslkp62#

无论是否使用“FLAG=-DNDEBUG”调用make,您都需要在Makefile中使用如下规则:
%.o: %.c gcc -c $(FLAG) $<
在C代码中,您将需要类似于以下内容的内容:

#ifndef NDEBUG
  fprintf(stderr, "My trace message\n");
#endif

相关问题