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;
}
/* 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;
}
2条答案
按热度按时间ecfdbz9o1#
假设你正在谈论来自标准库的
assert
宏(<assert.h>
中的#define
d),那么你不必做任何事情。库已经处理了NDEBUG
标志。如果你想让你自己的代码只在宏是/不是
#define
d的情况下执行操作,那么就使用一个#ifdef
,就像你在问题中已经怀疑的那样。例如,我们可能有一个条件太复杂,无法放入单个
assert
表达式中,所以我们需要一个变量来表示它。但是如果assert
展开为空,那么我们不希望计算该值。因此,我们可以使用类似如下的表达式。请注意,这种编码风格使代码难以阅读,并且 * 要求 * 极难调试的Heisenbugs。一种更好的表达方式是使用函数。
uajslkp62#
无论是否使用“FLAG=-DNDEBUG”调用make,您都需要在Makefile中使用如下规则:
%.o: %.c gcc -c $(FLAG) $<
在C代码中,您将需要类似于以下内容的内容: