相关疑难解决方法(0)

零长度位域的实际应用

我不完全确定C,但C++允许未命名的0字段位字段.例如:

struct X
{
    int : 0;
};
Run Code Online (Sandbox Code Playgroud)
  • 问题一:您能想到的实际用途是什么?
  • 问题二:你知道什么是现实世界的实际用途(如果有的话)?

在冰犯罪的回答之后编辑了这个例子

编辑:好的,多亏了目前的答案,我现在知道了理论目的.但问题是关于实际用途,所以他们仍然持有:)

c c++ bit-fields

26
推荐指数
4
解决办法
5242
查看次数

C++ 11内存模型并在不同的线程中访问同一结构的不同成员

假设您有以下定义:

struct X
{
  char a, b;
};

X x;
Run Code Online (Sandbox Code Playgroud)

现在假设您有两个线程,其中一个读取和写入x.a但从不访问,x.b而另一个读取和写入x.b但从不访问x.a.两个线程都不使用任何锁或其他同步原语.这可以保证在C++ 11中有效吗?或者它是否算作访问同一个对象,因此需要锁定?

c++ multithreading memory-model thread-safety c++11

17
推荐指数
1
解决办法
726
查看次数

C中未命名的零长度位字段是什么意思?

我在C标准草案(n1570)中看到了以下示例:

$ 3.14第4段:宣布为以下结构:

struct 
{
        char a;
        int b:5, c:11, :0, d:8;
        struct 
        { 
            int ee:8; 
        } e;
}
Run Code Online (Sandbox Code Playgroud)

那么,什么:0意思呢?

我知道什么是字段,但:0没有名字,我不明白.

:0没有任何标识符的目的是什么?

c structure bit-fields

13
推荐指数
2
解决办法
802
查看次数

有符号位字段表示

我做了一个字段大小为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;
}
Run Code Online (Sandbox Code Playgroud)

输出为:00000000000000000000000000000001

-1

在那种情况下,为什么我的位字段的值是-1,当我使用signed int而不是unsigned时,它总是一个负数?

c bit-fields

4
推荐指数
1
解决办法
1639
查看次数