不是个省油的灯 发表于 2019-9-10 13:58:02

c语言中,如何比较两个结构体是否有相同的成员变量

麻烦各位,请教一个问题

现在有2个结构体,A和B,分别如下:

Struct {
   UINT8 Var1;
   UINT8 Var2;
   UINT8 Var3;
   ...
}A;

Struct {
   UINT8 Var1;
   UINT8 Var2;
   UINT8 Var3;
   UINT8 Var4;
   ...
}B;

通过什么方法才能知道: 结构体A和结构体B 有相同的成员变量 Var1、 Var2、 Var3(换句话说就是,已经两个结构体A和B,如何知道他们之间的成员变量是否有交集)

不是个省油的灯 发表于 2019-9-10 14:48:50

A的成员变量是固定的,B的成员变量是动态的,这一次是Var1、Var2、Var3和Var4,下一次也许就是Var1和Var2。之前有想过,通过将变量名转化为字符串后再进行对比,但是这种方法有一个局限性,就是一旦B的成员变量名多一个字符,或者少一个字符(比如变成Var11或Va1),那这种通过匹配字符串的方式就不行了(对于程序升级来说,Var1和Var11或Va1来说,是用做同一个用途的),所以求助广大网友,看看还有没有别的方式可以知道结构体A和结构体B 有相同的成员变量

jackz007 发表于 2019-9-10 15:50:55

      很可笑的问题,A.Var1 = 0 , B . Var8 = 0这两个成员算不算有交集,请问,楼主?

不是个省油的灯 发表于 2019-9-10 17:57:02

jackz007 发表于 2019-9-10 15:50
很可笑的问题,A.Var1 = 0 , B . Var8 = 0这两个成员算不算有交集,请问,楼主?

不算,要的是成员变量一样,或者相似,跟具体的数值没关系

不是个省油的灯 发表于 2019-9-10 18:12:26

jackz007 发表于 2019-9-10 15:50
很可笑的问题,A.Var1 = 0 , B . Var8 = 0这两个成员算不算有交集,请问,楼主?

假如A.var1用作一个flag标志位去if判断,升级程序后,B.va11 有同样的作用,那var1和va11就可以理解为同一个成员变量,所以,不知道用什么方法判定A.var1和B.va11是同一个成员变量。之前想过通过把var1转化为“var1”,但是有局限性,一旦B里面不是var1(比如变成va11),那转化字符串这个方法就不适用了

jackz007 发表于 2019-9-10 19:29:01

不是个省油的灯 发表于 2019-9-10 18:12
假如A.var1用作一个flag标志位去if判断,升级程序后,B.va11 有同样的作用,那var1和va11就可以理解为同 ...

      如果程序是你在写,哪个成员怎么使用还不是你在规划和安排,何须这样猜测?

不是个省油的灯 发表于 2019-9-11 09:20:55

jackz007 发表于 2019-9-10 19:29
如果程序是你在写,哪个成员怎么使用还不是你在规划和安排,何须这样猜测?

程序不是我在写,实际的项目中,新旧程序可能会有不同的人来做,成员变量名会有细微的差别,毕竟是不同的人来写来维护,结构体多一个变量少一个变量,成员变量名多个字母少个字母,这情况是有可能出现的

flamer 发表于 2019-9-11 16:49:04

我也不是很懂,变量名只是相当于助记符,编译之后都是些地址,交集是指 值还是地址

不是个省油的灯 发表于 2019-9-11 18:42:39

本帖最后由 不是个省油的灯 于 2019-9-11 19:25 编辑

flamer 发表于 2019-9-11 16:49
我也不是很懂,变量名只是相当于助记符,编译之后都是些地址,交集是指 值还是地址

举个例子,比如APP软件程序升级,旧程序只支持一个用户登录,然后有个结构体
StructA{
UINT32 UserID;
}
用UserID来存放用户名ID(身份证号,手机号什么的)

现在升级APP,新程序支持多个用户登录,然后有个结构体
StructB{
UINT32 UserIDOne;
UINT32 UserIDTwo;
......
}
(我要用UserIDOne来存放旧程序的UserID)

对于我自己一个用户来说,我希望APP升级后,自动获取到旧程序的ID,不需要我自己手动输入,那我是不是要取得StructA.UserID的数据,然后赋值给StructB.UserIDOne,这样升级程序后,用户就不再需要输入ID了。那么问题来了,我怎么知道StructA.UserID要赋值给StructB.UserIDOne,而不是赋值给StructB.UserIDTwo?。

如果结构体换成
StructB{
UINT32 UserIDTwo;
UINT32 UserIDOne;
......
}呢?

所以我的问题就是,如何把StructA.UserID和StructB.UserIDOne对应起来?或者说怎么去匹配StructA.UserID和StructB.UserIDOne?

因为项目中有上万个文件,所以有大量的结构体和大量的成员变量,我不可能在新程序中用到哪个成员变量就把旧程序的取出来再赋值,现在是有办法可以一次性获取到新旧程序的成员变量,所以想在某个地方写一个函数,一次性的去匹配然后新旧成员变量赋值
页: [1]
查看完整版本: c语言中,如何比较两个结构体是否有相同的成员变量