Условная ошибка 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 должны быть постоянными.