C中联合内部的匿名结构

c3frrgcw  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(123)

我正在使用Microchip的XC 32为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;

注意这两个匿名结构。
由于这两个结构都很大,经常变化,并且它们的代码是由其他脚本自动生成的,因此像这样使用它们会更方便:

// 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;

编译器对union中的两行都说declaration does not declare anything时,编译失败。这听起来很公平。
如果我把它们命名为bellow就可以了,但是最终的代码将被迫意识到这种结构上的变化,这对我们的应用程序不好。

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

Context_t c;

c.d.data[0] = 1;
c.b.bit2 = false;

我想我是这里的罪魁祸首,失败的例子是失败的,因为我宣布工会的错误方式。
任何小费都欢迎!

qqrboqgw

qqrboqgw1#

您可以利用包含文件本质上是复制并粘贴到包含它们的源文件中的这一事实来完成您想要的操作。
如果您有bit.h,则只包含以下内容:

struct {
    uint16_t bit1 : 1;
    uint16_t bit2 : 1;
    // .. MUCH more items...
};

和data. h仅以下内容:

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

然后,您可以像这样创建您的并集:

typedef union {
  #include "bits.h"
  #include "data.h"
} Context_t;

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

相关问题