我有一个用于在c中模拟动态数组的库。所以我有不同的功能,创建一个列表并添加节点。在main函数中,假设它正在使用库的人不知道列表是什么。
main()
{
list dinarr = new_list(3,'d');
在这种情况下,它将创建一个包含三个节点的列表。在结构列表中,我只有一个数据类型char数据[60]。但是,用户很好地认为它是double类型的数组类型。
double x = 2.5;
dinarr = put_list(dinnar,1,&x);
这里我有一个函数,给定一个位置,将在该节点中放置一个值。数组被声明为double,因此用户输入双数组是合乎逻辑的。但是,由于我不知道用户创建的另一个类型的数组,我在该函数中有一个void指针,给定数组的类型(在这种情况下为double)将void指针转换为a双指针和一个char,所以我可以将该数据放在列表中。在这里,我没有任何问题。
double y = 0;
y = get_list(dinnar,1);
这是我有一个双var调用y,因为我创建了一个双数组,然后在get_list中我发送位置和列表,因此该函数将为我带来用户需要的数据。在该函数中,我有一个开关,如果数组的数据类型是d(double),c(char),s(string),i(int)或f(float)。它将结构列表的char数据转换为数组在这种情况下为double的类型。但我不知道如何只用一个参数返回不同类型的数据。我使用了一个结构,但后来我必须在main中声明该结构,其主要目的是用户没有注意到。
}
那么什么样的类型,我应该声明我的功能? 我使用了void指针和struct,但它对我不起作用,因为用户不应该知道我的库中发生了什么。
答案 0 :(得分:0)
你不能实现它,C不支持重载或具有相同名称但返回类型不同的多个函数。
您可以通过使列表getter获取指向调用者想要结果的位置的指针来解决它:
double y;
get_list(dinnar, &y);
在引擎盖下,您的列表模块会复制该值,因为它知道(来自'd'
格式说明符)所需的大小。您当然可以将 部分概括为仅使用size_t itemSize
而不是格式字母,以使列表能够处理任意大小的项目。
虽然使用起来并不方便,但很难改进。