我在这里用C语言编程,适用于Windows和各种Unix平台。我有一组结构,它们有共同的字段,但也有不同的字段。例如:
typedef struct {
char street[10];
char city[10];
char lat[10];
char long[10];
} ADDR_A;
typedef struct {
char street[10];
char city[10];
char zip[10];
char country[10];
} ADDR_B;
它们显然不是那么简单,我实际上有6个不同的结构,但这是基本的想法。
我想要的是一个函数,在这个函数中,我可以传递一个指向其中一个的指针,并且能够更新公共字段。类似于:
static void updateFields( void *myStruct ) {
strcpy( myStruct->street, streetFromSomethingElse );
strcpy( myStruct->city, cityFromSomethingElse );
}
显然,由于空指针和某种类型的强制转换,我在那里写的东西不起作用,但没有真正好的方法来强制转换(是吗?)。我不反对以某种方式指定结构类型的附加参数。
出于一些不相关的原因,我不能更改这些结构,也不能组合它们,也不能用它们做任何其他事情。我必须按原样使用它们。
一如既往地,提前感谢你的帮助。
编辑:正如我在下面的评论中添加的,公共字段不能保证都在开头,或者全部在结尾,或者其他任何东西。它们只是被保证存在。
发布于 2009-09-18 10:21:27
考虑到结构至少没有类似的布局,实现这一点的方法有限,既不简短也不优雅:
在C中破解这样的东西并不容易,也不好(没有鸭子类型)。这是一个典型的示例,其中动态语言会更方便(也许您可以从代码中调用python?:)
发布于 2009-09-18 09:37:40
德米特规则--只暴露最小的结构--可能适用。
static void updateStreetAndCity ( char *street, char *city ) {
strcpy( street, streetFromSomethingElse );
strcpy( city, cityFromSomethingElse );
}
它有一个轻微的开销,你必须使用两个指针而不是一个指针来调用它,但它符合一个函数的要求,该函数将适用于所有结构类型。
如果你的结构有不同的大小,你可以使用宏来提供静态多态性,就像在C99的tgmath.h中所做的那样,但这是相当大的工作量。
发布于 2009-09-18 09:52:46
#define ASSIGN(type,object,member,value) do { \
((type *)object)->member = value; \
} while (0)
现在你可以做这样的事情:
#include <stdio.h>
struct foo {
int x;
char y;
};
struct bar {
char y;
int x;
};
int main () {
struct foo foo;
struct bar bar;
ASSIGN(struct foo, &foo, x, 100);
ASSIGN(struct bar, &bar, y, 'x');
// ...
}
当然,您总是可以对其进行扩展,以包含一个函数调用来执行操作,因此支持memcpy
或strcpy
或类似的操作将是微不足道的。
https://stackoverflow.com/questions/1445762
复制相似问题