获取结构中匿名结构的大小

lor*_*hog 1 c

我需要创建一个具有特定大小的结构来优化内存访问。在正常情况下,“保留”字段用于将结构填充为特定大小。我正在寻找一种定义匿名结构的方法,以便我可以使用其大小来填充保留字段,这样我就不必不断更新保留填充大小。

实现这一点的一种方法是

typedef struct _xferStructure_t
{
    struct anonymous
    {
        uint32_t field1;
        uint32_t field2;
        uint32_t field3;
    } _;
  
  uint8_t reserved[1024 - sizeof(struct anonymous)];
    
} xferStructure_t;



int main()
{
    xferStructure_t xferData = {  ._.field1 = 1, ._.field2 = 2, ._.field3 = 3 };
    
    printf("Field 1 = %d", xferData._.field1);
    printf("Reserved = %ld", sizeof(xferData.reserved));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想访问匿名结构中的三个字段而不声明它。所以,像

typedef struct _xferStructure_t
{
    struct anonymous
    {
        uint32_t field1;
        uint32_t field2;
        uint32_t field3;
    };
  
  uint8_t reserved[1024 - sizeof(struct anonymous)];
    
} xferStructure_t;



int main()
{
    xferStructure_t xferData = {  .field1 = 1, .field2 = 2, .field3 = 3 };
    
    printf("Field 1 = %d", xferData.field1);
    printf("Reserved = %ld", sizeof(xferData.reserved));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第二种实现不起作用,但有没有一种方法可以实现该结构,而不必在 xfer 结构中声明匿名?

pma*_*ane 5

这似乎有效,使用匿名联合和匿名结构。它也不需要您计算填充的大小:

#include <stdio.h>
#include <stdint.h>

typedef struct {
    union {
        struct {
            uint32_t field1;
            uint32_t field2;
            uint32_t field3;
        };
        char fill[1024];
    };
} xferStructure_t;

int main(void)
{
    xferStructure_t xferData = {  .field1 = 1, .field2 = 2, .field3 = 3 };

    _Static_assert(sizeof xferData == 1024);

    printf("Field 1 = %d\n", xferData.field1);
    //printf("Reserved = %ld", sizeof(xferData.reserved));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Field 1 = 1
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 22.04 上的 gcc 11.4.0 上进行了测试。一旦使用 C23 编译器进行编译,就可以将其_Static_assert()更改为。static_assert()