避免重复使用类似的代码结构 C

3

我正在一个程序中工作,其中有三个类似的结构。

typedef struct{
  int id;
  Person p;
}Client;

typedef struct{
  int id;
  Person p;
}Employee;

typedef struct{
  int id;
  Person p;
}Provider;

生成的数据保存在三个不同的文件中。 大部分函数使用的信息来自Person p;它们都很相似(制作客户/员工/提供商,列出它们等等)。 问题是,因为它们是三种不同的结构,我必须为每项工作重复代码三次,以从每个人提取信息或制作数组以排序文件。 我无法想到一种方法来使用正确类型的单个代码避免这个问题。 示例代码:
int extractNameProvider(){
  FILE *arch;
  int ret=0;
  Provider pro;
  arch=fopen("fileP","rb");
  if(arch!=NULL){
    fread(&cli,sizeof(Provider),1,arch);
    printf("%s",pro.p.name);
    fclose(arch);
  }
  else{
    ret=-1;
  }
  return ret;
}

int extractNameClient(){
  FILE *arch;
  int ret=0;
  Client cli;
  arch=fopen("fileC","rb");
  if(arch!=NULL){
    fread(&cli,sizeof(Client),1,arch);
    printf("%s",cli.p.name);
    fclose(arch);
  }
  else{
    ret=-1;
  }
  return ret;
}

int extractNameEmployee(){
  FILE *arch;
  int ret=0;
  Employee emp;
  arch=fopen("fileE","rb");
  if(arch!=NULL){
    fread(&emp,sizeof(Employee),1,arch);
    printf("%s",emp.p.name);
    fclose(arch);
  }
  else{
    ret=-1;
  }
  return ret;
}

4
由于所有三个结构体都是严格相同的,你可以只使用一个结构体,这样就解决了你的问题。 - Jabberwocky
2
使用同一结构体。如果您想提高代码可读性,请使用typedef并将ClientEmployeeProvider定义为相同的结构体。 - Afshin
1个回答

5

如果所有的struct都是相同的,你可以在文件中共享一个基本的structtypedef,例如:

/* base.h */
struct BasePerson{
  int id;
  Person p;
};

/* client.h */
#include "base.h"
typedef struct BasePerson Client;

/* employee.h */
#include "base.h"
typedef struct BasePerson Employee;

/* provider.h */
#include "base.h"
typedef struct BasePerson Provider;

然后:

int extractNamePerson(char *file){
  FILE *arch;
  int ret=0;
  struct BasePerson person;
  arch=fopen(file,"rb");
  if(arch!=NULL){
    fread(&person,sizeof(struct BasePerson),1,arch);
    printf("%s",person.p.name);
    fclose(arch);
  }
  else{
    ret=-1;
  }
  return ret;
}

1
这里有一个警告:可以在不同类型之间进行赋值。例如,将Client赋值给Employee。如果它们的id字段在语义上有所不同,这可能会导致问题。 - user694733

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接