在C编程中修改接受不同类型参数的方法

时间:2013-08-27 13:43:41

标签: c

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方法。请帮助我。

3 个答案:

答案 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");