Не компилятор, а препроцессор - немного разные вещи.
Короткий ответ: нельзя.
Правильный ответ: если очень хочется, то можно посредствам анальных извращений и библиотеки Boost Preprocessor.
Например, сложение:
http://www.boost.org/doc/libs/1_39_0/libs/.../doc/index.htmlХотя, в вашем случае может не сработать. У макроса BOOST_PP_ADD и аргументы и результат не должны превышать 256, а у вас аж 1085. Но, опять-же если очень хочется, то можно попробывать обойти это ограничение, разбив исходное выражение на два "байта" (с диапазоном 0..100 для удобства), вычислять их отдельно, потом склеить.
Но вот вопрос: оно того стоит?
Если вопрос стоит в том, что нужно проконтролировать, что значение USED_BLOCKS не выходит за некоторые пределы, то есть другой способ. Называется STATIC_ASSERT:
Код
#define CONCAT2(First, Second) (First ## Second)
#define CONCAT(First, Second) CONCAT2(First, Second)
#define STATIC_ASSERT(expr) typedef char CONCAT(static_assert_failed_at_line_, __LINE__) [(expr) ? 1 : -1]
Пользоваться им так:
Код
STATIC_ASSERT(USED_BLOCKS < 1500);
STATIC_ASSERT(USED_BLOCKS > 100);
Здесь выражение вычисляестся уже не препроцессором, а компилятором. Если значение USED_BLOCKS будет больше 1500, то в первой строке возникнет ошибка вида:
"error: Array 'static_assert_failed_at_line_xxx' has a negative length". Аналогично во второй строке, если USED_BLOCKS будет меньше или равно 100. Если значение в нужном диапозоне, то STATIC_ASSERT-ы компилируются без ошибок. Условия можно задавать сколь угодно сложные.