私は以下のような機能を持っています。2 つの引数を取ります。1 つは構造体を指す void ポインターで、もう 1 つはバージョン番号です。渡されたバージョンに応じて、void ポインターを 2 つの構造にキャストする必要がありますが、これらはほとんど同じです (1 つは配列を持ち、もう 1 つはポインターを使用します)。
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)*/
}
配列アクセスとポインタ アクセスのコードは似ているため、2 つのバージョンの唯一の違いは 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 */
}
}
配列アクセスとポインター アクセスが類似しているため、上記のコード ブロックは類似しています。上記の場合、コードの重複を避けたい。どんな助けでも大歓迎です。コードの重複を避けるのに役立つソリューションを探しています。
注: 構造体メンバーが定義されている順序を変更することはできません。配列が構造体定義の最後の要素である場合、解決策は簡単であることを理解しています。下位互換性のため、構造体要素の順序を変更することはできません。
編集 1: 入力構造体を入力して呼び出し元の関数に返す必要がある類似の API がもう 1 つあります。
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 */
}
}
このケースも処理でき、コードの重複を回避できるソリューションを探しています。