是否有任何方法可以确保ARRAY尺寸符合编译时的预期?

时间:2014-09-11 12:58:35

标签: arrays macros

mem_pool_tbl是一个数组表,索引是TBL_ID_TYPE枚举,

typedef enum
{
    TBL_ID_BEGIN = 0;
    TBL_ID_1,
    TBL_ID_2,
    TBL_ID_MAX,
}TBL_ID_TYPE;

int mem_pool_tbl[TBL_ID_TYPE]=
{1,2,3,4}

如果下面的方法看起来像下面那样检查大小/ ID是否为macth,我会徘徊,如下所示:

#define ARRAY_SIZE(x)  (sizeof(x) /  sizeof(x[0]))

#define CHECK_TBL_MISMATCH  ((TBL_ID_MAX - TBL_ID_BEGIN ) != ARRAY_SIZE(mem_pool_tbl))

#if CHECK_NV_TBL_MISMATCH
# Hi there, if you see compiler err here , check the tbl if the ID is match 
#endif  

1 个答案:

答案 0 :(得分:0)

C不支持范围检查数组(尽管某些编译器有一个静态分析器,它会尝试使用启发式检测此类错误)。它通常也没有办法确定数组的大小,因为数组只是一个字节范围,并且可以位于堆栈变量或堆块的中间。

但是,您可以使用两种方法:

1)完成数组的创建,从而防止客户端错误地使用它们。 E.g。

部首:

struct OpaqueTBLArray;

struct OpaqueTBLArray*  MallocTblArray();
void                    FreeTblArray();
int                     GetTblArray( struct OpaqueTBLArray* self, size_t idx );
void                    SetTblArray( struct OpaqueTBLArray* self, size_t idx, int value );

实施源文件:

struct OpaqueTBLArray
{
    int     mem_pool_tbl[TBL_ID_MAX];
}

struct OpaqueTBLArray*  MallocTblArray()
{
    return (OpaqueTBLArray*) malloc( sizeof(OpaqueTBLArray) );
}

void                    FreeTblArray( OpaqueTBLArray* self )
{
    free( self );
}

int                     GetTblArray( struct OpaqueTBLArray* self, size_t idx )
{
    return self->mem_pool_tbl[idx];
}


void                    SetTblArray( struct OpaqueTBLArray* self, size_t idx, int value )
{
    self->mem_pool_tbl[idx] = value;
}

这样,没有人使用你的结构会知道它的大小,或者能够在没有更多努力的情况下提供其他东西。例如,如果您只是在结构中添加一个size字段,那么这种方法也可以用于泛型数组类。

2)如果您的数组始终是本地范围内的堆栈变量,则可以在其上使用sizeof()运算符并除以sizeof(int)。但是,这仅适用于直接的,本地声明的固定大小的数组,而不适用于预处理器。