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

实现这一点的一种方法是

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

理想情况下,我希望访问匿名 struct 中的三个字段,而无需声明它.所以,像这样的东西

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

第二个实现不起作用,但有没有办法实现这个 struct ,而不必在xfer struct 中声明匿名对象?

推荐答案

这似乎是可行的,使用匿名联合和匿名 struct .它也不需要计算填充的大小:

#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()
{
    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;
}

输出:

Field 1 = 1

在Ubuntu 22.04上的GCC 11.4.0上测试.一旦您使用C23编译器进行编译,_Static_assert()就可以更改为static_assert().

C++相关问答推荐

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

C sscanf没有捕获第二个参数

创建一个fork导致fget无限地重新读取文件

为什么删除CAP_DAC_OVERRIDE后创建文件失败?

如何在C客户端应用程序的ClientHello消息中添加自定义扩展?

如何在C中引发/处理自定义信号?

VS代码';S C/C++扩展称C23真关键字和假关键字未定义

如何在C++中安全地进行浮点运算

有没有办法减少C语言中线程的堆大小?

将复合文字数组用作临时字符串缓冲区是否合理?

从Raku nativecall调用时精度不同

在我的函数中实现va_arg的问题

计算时出现奇怪的计算错误;N Select K;在C中

分支预测和UB(未定义的行为)

共享内存未授予父进程权限

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

C 语言中 CORDIC 对数的问题

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

这些表达式是否涉及 C 中定义的复合文字?

将数组返回到链表