Вы можете использовать трюк, который вызывает ошибку времени компиляции, если условие не выполняется:
#define ASSERT(condition) (sizeof (struct { int:-!(condition); }))
#define x1 23
#define x2 42
void f(void) {
ASSERT(x1 < 31);
ASSERT(x1 > 31);
ASSERT(x2 < 31);
ASSERT(x2 > 31);
}
Он работает, оценивая условие оператором !
как 1 для false
и 0 для true
. Этот номер используется для объявления анонимного битового поля размером -1 или 0 соответственно в struct
. Анонимная структура просто используется для оператора sizeof
, а результат отбрасывается как неиспользуемое выражение.
Поскольку отрицательный размер битового поля не разрешен, компилятор выведет сообщение о диагностике c, если условие не выполняется.
Если условие выполнено, компилятор с радостью оптимизирует неиспользуемое выражение и не сгенерирует код для строки.
Вы можете увеличить ASSERT()
на комментарий за ним, если это необходимо. Диагностическое сообщение c покажет его.
ASSERT(x1 < 31); // Bla bla bla