2

私が使用している 2 つの構造体があり、それらはほぼ同一に定義されています。これらは、変更できないヘッダー ファイルで定義されています。

typedef struct
{
    uint32_t    property1;
    uint32_t    property2;
} CarV1;

typedef struct
{
    uint32_t    property1;
    uint32_t    property2;
    /* V2 specific properties */
    uint32_t    property3;
    uint32_t    property4;
} CarV2;

私のコードでは、すべてのベースをカバーするために、ファイルの先頭で V2 構造体を初期化します。

static const carV2 my_car =  {
    .property1 =   value,
    .property2 =   value,
    /* V2 specific properties */
    .property3 =   value,
    .property4 =   value
};

後で、初期化した値を取得し、それらを構造体にコピーして、void ポインターを介して関数から返されるようにしたいと考えています。車の V2 プロパティが必要な場合もあれば、V1 プロパティが必要な場合もあります。定義/初期化を重複させずに安全に memcpy するにはどうすればよいですか? 私は C にかなり慣れていないので、これは見苦しく、このコードを見てエンジニアが私をフォローすることは承認されないことを理解しています。これを行うためのきれいな方法は何ですか?

int get_properties(void *returned_car){
     int version = get_version();
     switch (version){
         case V1:
         {
             CarV1 *car = returned_car;
             memcpy(car, &my_car, sizeof(CarV1)); // is this safe? What's a better way?
         }
         case V2:
         {
             CarV2 *car = returned_car;
             memcpy(car, &my_car, sizeof(CarV2));
         }
    }
}
4

4 に答える 4

0

memcpy(&car, ... の代わりに memcpy (car, ... を使用する必要がありますが、そのような場合に memcpy を使用する理由はありません。むしろ、それぞれをコピーする必要があります。別のステートメントのフィールドの。

car->property1 = my_car.property1

(my_car はポインタかどうか? コード フラグメントからは判別できません)

2 番目のケースでは、構造体全体を割り当てることができると思います: *car = my_car

于 2013-05-15T03:24:00.997 に答える