2012-03-09 11 views
0

この#define ULONG_BIT評価((COUNT_BITS(ULONG_MAX)))のようなもの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)) 
.... 

ちょっと重い足ソリューションです

#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 

任意回答の場合は

+5

あなたが何を求めているのか分かりません。マクロは「評価」されません。プリプロセッサは単にテキスト置換を実行します。 –

+0

'#ULONG_BIT COUNT_BITS_128b(ULONG_MAX)'で十分でしょうか?これは(非常に複雑ですが、依然として)*定数式*です。最適化コンパイラは単純な定数に変換されます。 –

+0

@Basile Starynkevitchアプリケーション全体でCOUNT_BITS_128b(ULONG_MAX)として定義されたULONG_BITを使用すると、マクロサイズの制限や何かを打つことはありませんか? – Neko

答えて

0

本当に技術的にはULONG_MAXは単純進定数に解決されることを保証するものではありませんが、

#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) 

:これはこのような何かがトリックを行う可能性が前処理時に進値に解決する方法。

+0

私はこのアイデアが好きですが、あなたが言っているように、標準では明示的に 'ULONG_MAX'がデカディックナンバーとして定義されているとは言いませんので、基本的にはすべての可能性(8進数と16進数) 。まだ良いアイデア。 – Neko

関連する問題