0

以下对我来说Note似乎是ambiguous[在一本 C++ 书中找到]。

可以声明一个未命名Bit-Field的来创建填充以实现特定的对象布局。

作者想从上面的注释中传达什么?

我尝试了以下程序来理解但仍然不清楚。

class s
{
    public:
    unsigned  i:1;
};

int main()
{
    s x;
    x.i=1;
    cout<<x.i<<endl; //outputs 1
    return 0;
}

程序如何在不发出任何警告或错误的情况下完美运行?

我正在使用 ideone[ C++ (gcc-4.3.4)]:http: //ideone.com/bLLz4

但是,如果我unsigned从声明中删除,它会给出错误:

prog.cpp:7: error: ISO C++ forbids declaration of ‘i’ with no type   

另一个问题

class s
{
    public:
    int i:1;
};

int main()
{
    s x;
    x.i=1;
    cout<<x.i<<endl; //outputs -1
    return 0;
}

输出是否-1取决于机器架构['Endianness']?
输出如何-1?
http://ideone.com/XWbak

4

1 回答 1

2

顾名思义,未命名位字段是没有名称的位字段。你unsigned i:1;的名字不是匿名的;它的名字是i。名称是可选的;类型不是。

C 标准(我将引用N1570)在 6.7.2.1p12 中说:

没有声明符但只有冒号和宽度的位域声明表示未命名的位域。作为一种特殊情况,宽度为 0 的位域结构成员表示不再将位域打包到放置前一个位域(如果有的话)的单元中。

例如:

struct foo {
    unsigned int x:1;
    unsigned int  :0;
    unsigned int y:1;
};

请注意,位字段不能用于可靠地指定对象布局,因为它们表示的许多方面是实现定义的。

于 2012-06-25T06:39:26.333 回答