2012-03-09 55 views
0

这是工作,但它还挺重足的解决方案是否可以强制c中宏的评估?

#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 

Thx for any answer。

+5

我不确定你在问什么。宏根本没有被“评估”。预处理器只执行文本替换。 – 2012-03-09 22:33:55

+0

'#define ULONG_BIT COUNT_BITS_128b(ULONG_MAX)'是否够用?它是一个(非常复杂但仍然)*常量表达式*,任何优化编译器都会转换为一个简单常量。 – 2012-03-09 22:34:23

+0

@Basile Starynkevitch当我在整个应用程序中使用定义为COUNT_BITS_128b(ULONG_MAX)的ULONG_BIT时,我会不会触及任何宏观大小限制或什么? – Neko 2012-03-09 22:55:15

回答

0

如果你真的想找一个的方式,这样可以解决在预处理时间是这样的一个十进制值可能会做的伎俩:

#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解析为一个简单的十进制常量。

+0

我喜欢这个想法,但正如你所说的,标准没有明确说'ULONG_MAX'必须被定义为十进制数,所以基本上我必须覆盖所有的可能性(如八进制和十六进制),如果我想使用它。还是不错的主意。 – Neko 2012-03-10 00:20:34