我有一个功能如下。它需要 2 个参数。一个是指向结构的空指针,另一个是版本号。根据传递的版本,void 指针需要转换为 2 个几乎相似的结构。(一个有一个数组,另一个使用指针)。
struct some_v0{
char a;
int some_array[200];
char b;
}
struct some_v0{
char a;
int *some_array;
char b;
}
void some_api(void * some_struct, int version){
/* Depending on version the void pointer is cast to 2 different version of a struct*/
/* This is followed by some common code which is similar for both version of struct(as array access and pointer access have similar code)*/
}
由于数组访问和指针访问的代码相似,因此两个版本之间的唯一区别是 void 指针的强制转换。
我目前的方法如下。
void some_api(void * some_struct, int version){
if(version == 0){
struct some_v0 v0;
v0= *(struct some_v0 *)some_struct;
/* block of code which uses v0 */
}
if(version == 1){
struct some_v1 v1;
v1= *(struct some_v1 *)some_struct;
/* block of code which uses v1 */
}
}
上面使用的代码块是相似的,因为数组访问和指针访问是相似的。我想避免在上述情况下重复代码。任何帮助表示赞赏。我正在寻找一种可以帮助我避免重复代码的解决方案。
注意:我无法更改定义结构成员的顺序。我知道如果数组是结构定义中的最后一个元素,那么解决方案很简单。出于向后兼容性的原因,我不允许更改 struct 元素的顺序。
编辑 1:我还有一个类似的 API,我需要在其中填充输入结构并将其返回给调用函数。
void some_api(void * some_struct, int version){
if(version == 0){
struct some_v0 *v0;
v0= (struct some_v0 *)some_struct;
/* block of code which uses v0 fill v0*/
}
if(version == 1){
struct some_v1 *v1;
v1= (struct some_v1 *)some_struct;
/* block of code which uses v1. Fill v1 */
}
}
我正在寻找一种可以处理这种情况并避免重复代码的解决方案。