问题描述
我正在使用具有这些 typedef 的通用 adt
:
typedef void *Element;
typedef Element(*copyElements)(Element);
typedef Element(*copyElements)(Element);
typedef void(*freeElements)Element);
我必须使用这个创建函数传递它们:
GenericAdt create(copyElements copy,freeElements destroy);
所以我的问题是: 1)当我写一个我想传递给这个创建函数的复制函数时,我可以把它写成
SomeOtherType copy( SomeOtherType a);
而不是
Element copy(Element);
???
- 关于free函数的同样问题我可以写成
void destroy(SomeOtherType a);
而不是
void destroy( Element a);
???
解决方法
作为参数传递给 create
的函数必须与参数的类型兼容。
要使两种函数类型兼容,参数的数量和类型必须相同,并且返回类型必须相同。在您的示例中, SomeOtherType copy( SomeOtherType a)
与 copyElements
类型不兼容,因为返回类型不同且参数类型不同。这同样适用于 void destroy(SomeOtherType a)
。所以你不能将这些传递给 create
函数。
使用适当的类型创建这些函数,并在函数内部强制转换相关指针:
Element copy(Element e)
{
struct SomeOtherType *oldvalue = (struct SomeOtherType *)e;
struct SomeOtherType *newvalue = malloc(sizeof *newvalue ));
// populate newvalue
return (Element)newvalue;
}
还有关于这个 typedef:
typedef void *Element;
将对象指针隐藏在 typedef
后面通常不是一个好主意,因为这会导致读者混淆是否使用了指针。但是对于函数指针,它更容易接受,因为它提高了可读性。