如果你没有通过哪类建筑(如你提出的空白*),那么你基本上就注定了。 他们只是一.一角的记忆。
你可以做的是拥有多个函数,比如你建议的update_fields,并根据结构类型调用正确的函数(这很容易,在宏中可以隐蔽一些语法噪音)。
下面是:
#include <stdio.h>
#include <string.h>
typedef struct {
char street[10];
char city[10];
char lat[10];
char lon[10];
} ADDR_A;
typedef struct {
char street[10];
char city[10];
char zip[10];
char country[10];
} ADDR_B;
#define UPDATEFIELDS(type, value) updateFields_##type(value)
static void updateFields_ADDR_A(ADDR_A *myStruct ) {
strcpy(myStruct->street, "abc" );
strcpy(myStruct->city, "def" );
}
static void updateFields_ADDR_B(ADDR_B *myStruct ) {
strcpy(myStruct->street, "abc" );
strcpy(myStruct->city, "def" );
}
int main(){
ADDR_A a;
ADDR_B b;
updateFields_ADDR_A(&a);
updateFields_ADDR_B(&b);
UPDATEFIELDS(ADDR_A, &a);
printf("%s
", a.city);
printf("%s
", b.city);
}
通知你显然不应在更新时写出实际的外地变化代码 外地 三十项职能,但只是使用该守则作为包裹,以便正确冲抵内地。
我也想使你能够再次使用宏观方法的地方化。
#define COMMONBODY strcpy(myStruct->street, "abc" );
strcpy(myStruct->city, "def" );
static void updateFields_ADDR_A(ADDR_A *myStruct ) {
COMMON_BODY
}
static void updateFields_ADDR_B(ADDR_B *myStruct ) {
COMMON_BODY
}
或甚至将共同守则单独列入档案,并将其列入两倍(不寻常,但工作档案)
static void updateFields_ADDR_A(ADDR_A *myStruct ) {
#include "commonbody.c"
}
static void updateFields_ADDR_B(ADDR_B *myStruct ) {
#include "commonbody.c"
}
几乎也可以(但我知道的)使用<typeof的操作者,但名称左部分除外。
如果你的结构规模不同,我们甚至只能使用一个更新的实地功能(无效*),这种功能将结构的规模作为第二个参数,并用于自动投放到正确的类别。 它非常 d,但可能[如果有人想看到这一解决办法得到发展,请评论]。
也可以使用工会。 如果存在共同的预先规定,任何工会成员都可以进入共同的领域(但我的理解是不是这样)。 你们必须认识到,界定这种结合并不改变现有数据结构。 这基本上界定了“ADDR_A”或“ADDR_B”的类型,而不是使用点子。
typedef union {
ADDR_A a;
ADDR_B b;
} ADDR_A_or_B;
如果存在共同的预先规定,你可以利用任何准入领域确定这些变量:
static void updateFields(ADDR_A_or_B *myStruct ) {
strcpy( myStruct->a.street, someStreeValueFromSomewhereElse);
strcpy( myStruct->a.city, someCityValueFromSomewhereElse);
}
在呼吁时,你才需要:
ADDR_A a;
updateFields((ADDR_A_or_B *)&a);
ADDR_B b;
updateFields((ADDR_A_or_B *)&b);