C 中联合内的匿名结构

Gus*_*gas 5 c unions data-structures

我正在使用 Microchip 的 XC32 为 ATSAM 设备编写代码(我不清楚是 C99 还是 C11)。

这段代码工作正常:

typedef union {
    struct {
        uint16_t bit1 : 1;
        uint16_t bit2 : 1;
        // .. MUCH more lines...
    };
    struct {
        uint32_t data[N];
        // ... more lines, with sub-structures....
    };
} Context_t;

Context_t c;

c.data[0] = 1;
c.bit2 = false;
Run Code Online (Sandbox Code Playgroud)

注意这两个匿名结构。

由于这两个结构都很大,并且一直在变化,并且它们的代码是由其他脚本自动生成的,所以像这样使用它们会更方便:

// bit.h
typedef struct {
    uint16_t bit1 : 1;
    uint16_t bit2 : 1;
    // .. MUCH more items...
} Bits_t;

// data.h
typedef struct {
    uint32_t data[N];
    // ... more code...
} Data_t;

// import both headers
typedef union {
    Bits_t;
    Data_t;
} Context_t;

Context_t c;

c.data[0] = 1;
c.bit2 = false;
Run Code Online (Sandbox Code Playgroud)

declaration does not declare anything对于联合内的两行,编译器无法构建。这对我来说听起来很公平。

如果我像下面这样命名它们,它就可以工作,但是最终的代码将被迫意识到结构的这种变化。对于我们的应用来说不太好。

typedef union {
    Bits_t b;
    Data_t d;
} Context_t;

Context_t c;

c.d.data[0] = 1;
c.b.bit2 = false;
Run Code Online (Sandbox Code Playgroud)

我认为我是这里的罪魁祸首,失败的例子是由于我以错误的方式宣布工会而失败的。

欢迎任何提示!

dbu*_*ush 5

您可以利用以下事实:包含文件本质上是复制并粘贴到包含它们的源文件中来执行您想要的操作。

如果您的 bit.h 仅包含以下内容:

struct {
    uint16_t bit1 : 1;
    uint16_t bit2 : 1;
    // .. MUCH more items...
};
Run Code Online (Sandbox Code Playgroud)

而 data.h 仅此:

struct {
    uint32_t data[N];
    // ... more code...
};
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样创建你的联合:

typedef union {
  #include "bits.h"
  #include "data.h"
} Context_t;
Run Code Online (Sandbox Code Playgroud)

允许两个内部结构都是匿名的并且可以在外部生成,而不必触及Context_t定义的模块。

  • @RobertHarvey它允许从外部生成bits.h和data.h的内容。当然,这也意味着任何使用此联合的代码都需要知道生成的内容。 (3认同)