typedef struct
{
char struct_variable_1a[10];
char struct_variable_1b[12];
} struct1;
typedef struct
{
char struct_variable_1a[10];
char struct_variable_1b[12];
int struct_variable_2c;
} struct2;
typedef struct1 *struct1_ptr;
typedef struct2 *struct2_ptr;
static void sampleFunction(struct1_ptr valueToInsert){
//this code does some stuff here
}
int main(){
struct1_ptr struct1_var = (struct1_ptr) malloc(sizeof(struct1));
strcpy(struct1_var->struct_variable_1a, "some value");
strcpy(struct1_var->struct_variable_1b, "some value");
sampleFunction(struct1_var);
return 0;
}
我在C programming
中有一个示例代码,如上所示。在main
方法中,我尝试为struct1_ptr
方法调用传递sampleFunction
类型的变量。
这就像一个魅力。但是当我想传递类型struct2_ptr
的变量时,编译器会抛出错误。基本上,我是java开发人员。我想在其参数中对任何变量类型重用此sampleFunction
方法。请帮助我。
答案 0 :(得分:3)
遗憾的是,C不支持方法重载/多态。所以你必须编写自己的方法论。
一个是,将类型作为第一个参数提供给每个重载函数。在函数内部,您可以使用一个简单的switch-case跳转到原始函数实现(如struct1_sampleFunction()和struct2_sampleFunction())。
另一种方法是,将RECORDCORE结构放在每个结构的开头,并将类型填入此RECORDCORE,这样每个函数都可以根据这些数据进行调度。
在这两种情况下,您都必须将原型从“struct1_ptr value”更改为“void * value”
答案 1 :(得分:3)
您可以像这样在C中模拟继承:
typedef struct
{
char struct_variable_1a[10];
char struct_variable_1b[12];
} struct1;
typedef struct
{
struct1 parent; /* Must be first element! */
int struct_variable_2c;
} struct2;
然后这样打电话:
sampleFunction((struct1_ptr)ptr_to_struct2);
或(我赞成这一点,因为没有演员表):
sampleFunction(&ptr_to_struct2->parent);
请注意,您无法在不将其强制转换的情况下访问struct2的成员。
这些适用于简单的结构,但如果你做任何更复杂的事情,使用C ++会更加合适。
答案 2 :(得分:2)
更改您的功能:
static void sampleFunction(struct1_ptr valueToInsert){
//this code does some stuff here
}
为:
static void sampleFunction(void* valueToInsert){
//this code does some stuff here
}
如果要识别结构的类型,请在函数中添加第二个参数,该参数包含结构的大小。
//编辑:
在函数内部,您必须将变量强制转换回要使用的结构。例如:
strcpy(((struct1_ptr)valueToInsert)->struct_variable_1a, "some value");