我需要创建一个具有特定大小的结构来优化内存访问。在正常情况下,“保留”字段用于将结构填充为特定大小。我正在寻找一种定义匿名结构的方法,以便我可以使用其大小来填充保留字段,这样我就不必不断更新保留填充大小。
实现这一点的一种方法是
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 结构中声明匿名?
这似乎有效,使用匿名联合和匿名结构。它也不需要您计算填充的大小:
#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()