结构为 208 位长变量

struct as 208 bits long variable

我正在尝试制作一个可以容纳 208 字节 位的 struct。我的意图是使用每 3 位变量存储 68 个值,每个值介于 0 和 4 之间。

我目前有这个,但是我遇到了很多错误:

typedef struct {
    uint64_t _1vr = 0;
    uint64_t _2vr = 0;
    uint64_t _3vr = 0;
    uint16_t _4vr = 0;
} TEST;

const TEST test_bits = {
    ._1vr = (BVUS_ZAC1 << 0) | (BVUS_ZAC2 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO2 << 9) | (BVUS_VISOKO << 12) |
    (BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO1 << 27) |
    (BVUS_VISOKO << 30) | (BVUS_NIZKO1 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO1 << 39) | (BVUS_VISOKO << 42) |
    (BVUS_NIZKO1 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO1 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO1 << 57) |
    (BVUS_VISOKO << 60),
    ._2vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO2 << 12) |
    (BVUS_VISOKO << 15) | (BVUS_NIZKO2 << 18) | (BVUS_VISOKO << 21) | (BVUS_NIZKO2 << 24) | (BVUS_VISOKO << 27) |
    (BVUS_NIZKO2 << 30) | (BVUS_VISOKO << 33) | (BVUS_NIZKO2 << 36) | (BVUS_VISOKO << 39) | (BVUS_NIZKO1 << 42) |
    (BVUS_VISOKO << 45) | (BVUS_NIZKO1 << 48) | (BVUS_VISOKO << 51) | (BVUS_NIZKO1 << 54) | (BVUS_VISOKO << 57) |
    (BVUS_NIZKO1 << 60),
    ._3vr = (BVUS_VISOKO << 0) | (BVUS_NIZKO1 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO1 << 9) | (BVUS_VISOKO << 12) |
    (BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO2 << 27) |
    (BVUS_VISOKO << 30) | (BVUS_NIZKO2 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO2 << 39) | (BVUS_VISOKO << 42) |
    (BVUS_NIZKO2 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO2 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO2 << 57) |
    (BVUS_VISOKO << 60),
    ._4vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) |     (BVUS_VISOKO << 9) | (BVUS_NIZKO1 << 12)
};

这些变量是在全局范围内定义的。

我不知道发生了什么事。老实说,我没有看到任何错误(当然我错了但是......)

编辑:

完全按照 WChargin 所说的去做我仍然无法摆脱下一个错误:

编辑2:

我正在 8 位架构上执行此操作。

问题:

  • 您不能在 struct 声明中初始化结构成员。 也就是说,您的 uint64_t _1vr = 0; 语句无效。 这就是您收到 "expected…before '=' token" 错误的原因。
  • 据推测,您的常量被定义为错误的大小——它们 long 不够吗? 为简单起见,我在这里使用了 #defines,它确实有效。

这个编译很好(gcc -c):

#include <stdint.h>

typedef struct {
    uint64_t _1vr;
    uint64_t _2vr;
    uint64_t _3vr;
    uint16_t _4vr;
} TEST;

#define BVUS_ZAC1    0ul
#define BVUS_ZAC2    0ul
#define BVUS_VISOKO  0ul
#define BVUS_NIZKO1  0ul
#define BVUS_NIZKO2  0ul

const TEST test_bits = {
    ._1vr = (BVUS_ZAC1 << 0) | (BVUS_ZAC2 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO2 << 9) | (BVUS_VISOKO << 12) |
    (BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO1 << 27) |
    (BVUS_VISOKO << 30) | (BVUS_NIZKO1 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO1 << 39) | (BVUS_VISOKO << 42) |
    (BVUS_NIZKO1 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO1 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO1 << 57) |
    (BVUS_VISOKO << 60),
    ._2vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO2 << 12) |
    (BVUS_VISOKO << 15) | (BVUS_NIZKO2 << 18) | (BVUS_VISOKO << 21) | (BVUS_NIZKO2 << 24) | (BVUS_VISOKO << 27) |
    (BVUS_NIZKO2 << 30) | (BVUS_VISOKO << 33) | (BVUS_NIZKO2 << 36) | (BVUS_VISOKO << 39) | (BVUS_NIZKO1 << 42) |
    (BVUS_VISOKO << 45) | (BVUS_NIZKO1 << 48) | (BVUS_VISOKO << 51) | (BVUS_NIZKO1 << 54) | (BVUS_VISOKO << 57) |
    (BVUS_NIZKO1 << 60),
    ._3vr = (BVUS_VISOKO << 0) | (BVUS_NIZKO1 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO1 << 9) | (BVUS_VISOKO << 12) |
    (BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO2 << 27) |
    (BVUS_VISOKO << 30) | (BVUS_NIZKO2 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO2 << 39) | (BVUS_VISOKO << 42) |
    (BVUS_NIZKO2 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO2 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO2 << 57) |
    (BVUS_VISOKO << 60),
    ._4vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) |     (BVUS_VISOKO << 9) | (BVUS_NIZKO1 << 12)
};

但是请注意,sizeof(TEST) 在我的(64 位)机器上产生 32。 这可能不是你想要的。

在这个特定的体系结构中,64 位被定义为 long long,因此更改发布到 ULL 的定义 @WChargin 是可行的。