我正在使用C语言编写一个基础图像处理库。我知道还有其他(非常好的)库存在,但这对我来说是一次学习经历,而不是达到目的的手段。
我已经定义了以下简化的结构(针对本问题):
union img_rawdata{
uint8_t* u8;
uint16_t* u16;
float* flt;
};
enum img_type{
IMG_U8,
IMG_U16,
IMG_FLT
};
struct image{
union img_rawdata rawdata;
enum img_type type;
unsigned int num_values;
};
我的问题是:在union中动态分配正确指针的首选方式是什么?
目前,我唯一看到的方法是使用switch语句,例如:
void alloc_img(struct image* img, enum img_type type, unsigned int num_vals){
switch (type){
case IMG_U8:
img->rawdata.u8 = (uint8_t*)malloc(num_vals*sizeof(uint8_t));
break;
case IMG_U16:
img->rawdata.u16 = (uint16_t*)malloc(num_vals*sizeof(uint16_t));
break;
case IMG_FLT:
img->rawdata.flt = (float*)malloc(num_vals*sizeof(float));
break;
}
}
这看起来并不那么糟糕。然而,在我的实现中,实际的内存分配大约有50行代码(因为rawdata不是一维的,还需要进行错误检查等操作)。
有没有预处理器的魔法可以减少代码冗余,或者这是编写此代码的最佳方式?
或者,另一种完全不同的方法能够避免这个问题吗?
malloc()
的返回值进行强制类型转换,这样做是多余的,而且可能会隐藏编译器本来可以检测到的错误。 - pmg