0
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_ptrsampleFunction方法调用传递一个类型的变量。这就像一个魅力。但是当我想传递一个类型的变量时struct2_ptr,编译器会抛出错误。基本上,我是java开发人员。我想将此sampleFunction方法用于其参数中的任何变量类型。请帮助我。

4

3 回答 3

3

不幸的是,C 不支持方法重载/多态。因此,您必须编写自己的方法论。

一个是,将类型作为第一个参数提供给每个重载函数。在函数内部,您可以通过一个简单的 switch-case 跳转到原始函数实现(如 struct1_sampleFunction() 和 struct2_sampleFunction())。

另一种是在每个结构的开头放置一个RECORDCORE结构,并将类型填充到这个RECORDCORE中,这样每个函数就可以根据这个数据进行调度。

在这两种情况下,您都必须将原型从“struct1_ptr value”更改为“void *value”

于 2013-08-27T13:51:54.687 回答
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++ 会更合适。

于 2013-08-27T13:56:14.513 回答
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");
于 2013-08-27T13:52:26.000 回答