C 中向量类型定义和数据保护的有效解决方案

问题描述 投票:0回答:1

如何在 C 中有效地定义动态数组的自定义类型,确保向量数据类型的 const 限定,而无需借助常量方法和 make_const 函数的重复结构?我目前正在使用以下实现:

typedef struct
{
    int *             data;
    unsigned long int len;
    unsigned long int size;
} VecInt;

typedef struct
{
    const int *       data;
    unsigned long int len;
    unsigned long int size;
} CVecInt;

CVecInt make_const_VecInt ( VecInt * src )
{
    return (CVecInt) { .data = src->data, .len = src->len, .size = src->size };
}

是否有更有效或更优雅的解决方案来实现 C 中向量数据类型所需的 const 限定?

我想避免由于与未对准相关的潜在风险而进行类型转换。

注意:MISRA-C 2012 推动了这一设计,解决方案至少应考虑此代码标准。

c pointers misra
1个回答
0
投票

是否有更高效或更优雅的解决方案来达到期望的效果 C 中向量数据类型的 const 限定?

是的,不要向库用户公开该结构。只允许通过功能访问。另外,我会使用灵活的数组成员。

typedef struct
{
    size_t len;
    size_t size;
    int data[];
} VecInt;


VecInt *create(size_t size)
{
    VecInt *v = malloc(sizeof(*v) + size * sizeof(v -> data[0]));
    if(v)
    {
        v -> len = 0;
        v -> size = size;
    }
    return v;
}

size_t getsize(const void *v)
{
    const VecInt *vi = v;
    return vi ? vi -> size : 0;
}

 /* etc */
© www.soinside.com 2019 - 2024. All rights reserved.