ご存知のように、一部のコンパイラでは次のようになります。
struct T{
char bits: 4; // 3:0
};
そして他の人のために:
struct T{
char bits: 4; // 7:4
};
これは標準で指定されていないためです。(これ(算術的意味)は標準で指定する必要があると思いますが、実際の物理的な割り当ては指定できない別の問題です。)
ただし、コードをより一般的なものにしたいので、次のことを試しました。
union helper{
unsigned char b:1;
unsigned char c;
constexpr helper(unsigned char i): c(i){}
};
constexpr int lsb_defined_at_top(){ return helper(1).b;}
enum{
LSB_AT_DEFINED_AT_TOP = lsb_defined_at_top()
};
しかし、コンパイラ (gcc 4.7.2) は文句を言います:
エラー: 定数式で初期化された 'helper::c' メンバーの代わりに 'helper::b' メンバーにアクセスしています
コンパイル時にこれを判断する方法はあるのだろうか...