gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:09:47 24 4
gpt4 key购买 nike

我需要设置一种从 make 文件调试程序的方法。具体来说,当我输入 make -B FLAG=-DNDEBUG 时,我需要程序正常运行。但是,当此标志不存在时,我需要在整个代码中运行一些 assert() 命令。

为了澄清我需要知道如何检查我的 C 代码中是否不存在此标志,我假设它与 #ifndef 有关,我只是不知道从那里去哪里。

请原谅我的无知,任何回复将不胜感激!

最佳答案

假设您正在谈论 assert如果您使用标准库中的宏( #define d in <assert.h> ),那么您无需执行任何操作。图书馆已经处理了 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;
}

关于c - 在 C 中使用 makefile 标志进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33140440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com