Можно ли форсировать оценку макроса в с? - PullRequest
0 голосов
/ 10 марта 2012

Это работает, но это своего рода мощное решение

#define COUNT_BITS_4b(Val) \
   ((Val) & 0x1) + (((Val) >> 1) & 0x1) + (((Val) >> 2) & 0x1) + (((Val) >> 3) & 0x1)
#define COUNT_BITS_8b(Val) \
   (COUNT_BITS_4b(Val) + COUNT_BITS_4b(Val >> 4))
#define COUNT_BITS_16b(Val) \
   (COUNT_BITS_8b(Val) + COUNT_BITS_8b(Val >> 8))
#define COUNT_BITS_32b(Val) \
   (COUNT_BITS_16b(Val) + COUNT_BITS_16b(Val >> 16))
#define COUNT_BITS_32b(Val) \
   (COUNT_BITS_16b(Val) + COUNT_BITS_16b((Val >> 31) >> 1))
....

Я бы хотел избавиться от этой части (замените его на что-то вроде #define ULONG_BIT Eval ((COUNT_BITS(ULONG_MAX)))

#if COUNT_BITS_128b(ULONG_MAX) == 32
   #define ULONG_BIT 32
#elif COUNT_BITS_128b(ULONG_MAX) == 33
   #define ULONG_BIT 33
#elif COUNT_BITS_128b(ULONG_MAX) == 34
   #define ULONG_BIT 34
....
#elif COUNT_BITS_128b(ULONG_MAX) == 128
   #define ULONG_BIT 128
#endif

Спасибо за любой ответ.

1 Ответ

0 голосов
/ 10 марта 2012

Если вы действительно ищете способ, которым это разрешается до десятичного значения во время предварительной обработки, то что-то вроде этого может помочь:

#define NEKO_4294967295 32
... for all the values up to 128 ...
... for all possible variants with U or UL appended ...
#define NEKO_TESTER(VAL) NEKO_ ## VAL
#define ULONG_BITS NEKO_TESTER(ULONG_MAX)

Хотя технически это не гарантирует, что ULONG_MAX разрешает впростая десятичная константа.

...