Условная ошибка x-macro - сравнение чисел

Я хотел бы сгенерировать ошибку времени компиляции для X-макроса для всех X(a, b) где a > b

/* X(a, b) */
#define LIST \
    X(10, 20) \
    X(5,  20) \
    X(30, 20) \
    X(1,  20)

Итак, сгенерируйте ошибку для X(30, 20)

Возможно ли это в C?

РЕДАКТИРОВАТЬ: пример использования Для меня левый номер, например, sizeof некоторой большой структуры, а правый номер - фиксированное пространство для хранения этой структуры. Если структура больше доступного пространства, мне нужен компилятор для генерации ошибки.

//e.g.
X(sizeof(struct conf), 2*PAGE)

2 ответа

Решение

Да, вот подтверждение концепции:

#pragma push_macro("X")
#undef X
#define X(a,b) typedef int x[(a>b)?-1:1];
LIST
#pragma pop_macro("X")

Итак, мы определяем X определить тип массива целых чисел, с -1 или 1, в зависимости от того, a больше, чем b, Если это так, массив элементов -1 вызовет ошибку.

Если используется C11, строку typedef можно сделать с помощью static_assert(a<=b) от assert.h

Это возможно в C11 с помощью ключевого слова _Static_assert:

#define X( a , b )  _Static_assert( a <= b , "Error!" ) 

Обратите внимание, что выражения a и b должны быть постоянными.

Другие вопросы по тегам