【发布时间】:2014-09-20 03:37:54
【问题描述】:
来自 C++ 标准草案 (N3337):
9.6 位域
4 如果值
true或false存储到任何大小的bool类型的位域(包括一位位域),则原始bool值和位域应比较相等。如果枚举数的值存储在相同枚举类型的位域中,并且位域中的位数大到足以容纳该枚举类型(7.2)的所有值,则原始枚举值和位域的值应该比较相等。
该标准对其他类型的位字段的任何此类行为没有作出承诺。为了了解 g++ (4.7.3) 如何处理其他类型的位域,我使用了以下测试程序:
#include <iostream>
enum TestEnum
{
V1 = 0,
V2
};
struct Foo
{
bool d1:1;
TestEnum d2:1;
int d3:1;
unsigned int d4:1;
};
int main()
{
Foo foo;
foo.d1 = true;
foo.d2 = V2;
foo.d3 = 1;
foo.d4 = 1;
std::cout << std::boolalpha;
std::cout << "d1: " << foo.d1 << std::endl;
std::cout << "d2: " << foo.d2 << std::endl;
std::cout << "d3: " << foo.d3 << std::endl;
std::cout << "d4: " << foo.d4 << std::endl;
std::cout << std::endl;
std::cout << (foo.d1 == true) << std::endl;
std::cout << (foo.d2 == V2) << std::endl;
std::cout << (foo.d3 == 1) << std::endl;
std::cout << (foo.d4 == 1) << std::endl;
return 0;
}
输出:
d1:真 d2:1 d3:-1 d4:1 真的 真的 错误的 真的我对与Foo::d3 对应的输出行感到惊讶。输出与ideone.com 相同。
由于标准对int 类型的位域的比较没有明确规定,g++ 似乎没有违反标准。这让我想到了我的问题。
使用int 类型的位域是个坏主意吗?是否应该气馁?
【问题讨论】:
-
好吧,我至少会为位字段使用
unsigned类型,任何signed类型在语义上都没有真正意义。
标签: c++ bit-fields