Проблема с
#if WORD == int && defined(__builtin_clrsb)
, кроме того факта, что ==
работает на значениях, а не на типах, в C ++ состоит в том, что #if
вычисляется на этапе предварительной обработки, а не на компиляции, ипрепроцессор действительно не знает, что такое int
.Правило для #if
состоит в том, что после подстановки всех макросов и оценки всех defined()
тестов каждый идентифицирующий маркер токен, кроме true
, даже ключевое слово C ++, которое не называет макрос, изменяется на 0
в порядкечтобы оценить #if
.
Итак, после замены какого-либо другого типа на WORD
(скажем, short
) и оценки defined
как 1
, препроцессор остается с
#if short == int && 1
, а затем ключевые слова изменяются на 0
:
#if 0 == 0 && 1
, что верно.
Я рекомендую шаблонное решение, показанное в ответ Якка .
[Но на случай, если кому-то все равно, вот взлом на основе препроцессора, который я имел здесь до того, как увидел ответ.Работает только если WORD
не содержит пробелов типа long long
.]
#define PP_CONCAT1(x,y) x ## y
#define PP_CONCAT(x,y) PP_CONCAT1(x,y)
#define PP_IS_INT_int 1
#define PP_IS_INT_signed 1 /* "signed" alone is the same type as "int" */
#if PP_CONCAT(PP_IS_INT_, WORD) && defined(__builtin_clrsb)