我不完全确定C,但C++允许未命名的0字段位字段.例如:
struct X
{
    int : 0;
};
在冰犯罪的回答之后编辑了这个例子
编辑:好的,多亏了目前的答案,我现在知道了理论目的.但问题是关于实际用途,所以他们仍然持有:)
假设您有以下定义:
struct X
{
  char a, b;
};
X x;
现在假设您有两个线程,其中一个读取和写入x.a但从不访问,x.b而另一个读取和写入x.b但从不访问x.a.两个线程都不使用任何锁或其他同步原语.这可以保证在C++ 11中有效吗?或者它是否算作访问同一个对象,因此需要锁定?
我在C标准草案(n1570)中看到了以下示例:
$ 3.14第4段:宣布为以下结构:
struct 
{
        char a;
        int b:5, c:11, :0, d:8;
        struct 
        { 
            int ee:8; 
        } e;
}
那么,什么:0意思呢?
我知道什么是字段,但:0没有名字,我不明白.
:0没有任何标识符的目的是什么?
我做了一个字段大小为1位的字段,而int不是使用unsigned.后来,当我试图检查字段的值时,我发现值为-1.我使用此代码检查二进制represantation和我的位字段的值:
#include <stdio.h>
#include <stdlib.h>
union {
    struct {
        int bit:1;
    } field;
    int rep;
} n;
int main() {
int c, k;
n.field.bit=1;
 for (c = 31; c >= 0; c--)
  {
    k = n.rep >> c;
    if (k & 1)
      printf("1");
    else
      printf("0");
  }
  printf("\n %d \n", n.field.bit);
return 0;
}
输出为:00000000000000000000000000000001
-1
在那种情况下,为什么我的位字段的值是-1,当我使用signed int而不是unsigned时,它总是一个负数?