Предполагая, что вы говорите о макросе assert
из стандартной библиотеки (#define
d в <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;
}