小编Tom*_*ter的帖子

数组+联合+包含位字段C++的结构

我只是玩弄了一些字段,遇到了一些我无法弄清楚如何绕过的东西.

(关于平台的注意事项:int的大小= 2bytes,long = 4bytes,long long = 8bytes - 认为值得一提,因为我知道它可以变化.'byte'类型被定义为'unsigned char')

我希望能够创建一个包含两个36位变量的数组,并将它们放入一个9字节数组的联合中.这就是我想出的:

typedef union {
  byte bytes[9];
  struct {
    unsigned long long data:36;
  } integers[2];
} Colour;
Run Code Online (Sandbox Code Playgroud)

我正在研究这样的理论,即编译器会意识到应该有两个位域作为匿名结构的一部分,并将它们放在9个字节的空间中.然而事实证明它们在字节边界处对齐,因此并集占用了10个字节而不是9个字节,这非常有意义.

那么问题是,有没有办法创建像这样的两个位字段的数组?我考虑了'packed'属性,但编译器只是忽略它.

虽然这按预期工作(sizeof()返回9):

typedef union {
  byte bytes[9];
  struct {
    unsigned long long data0:36;
    unsigned long long data1:36;
  } integers;
} Colour;
Run Code Online (Sandbox Code Playgroud)

最好让它可以作为数组访问.


编辑:感谢cdhowie解释为什么这不起作用.

幸运的是,我想到了一种实现我想要的方法:

typedef union {
  byte bytes[9];
  struct {
    unsigned long long data0:36;
    unsigned long long data1:36;
    unsigned long long data(byte which){
      return (which?data1:data0);
    }
    void data(byte which, unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ arduino avr-gcc

3
推荐指数
1
解决办法
4624
查看次数

标签 统计

arduino ×1

avr-gcc ×1

c++ ×1