【发布时间】:2012-09-08 18:59:31
【问题描述】:
我正在用 C 实现简单的列表库,但在编写 find 函数时遇到问题。
我希望我的函数接受 any 类型的参数来查找,两者:
find(my_list, 3) 和 find(my_list, my_int_var_to_find)。
我已经知道列表元素的类型是什么。
目前我已经找到了几种方法来处理这个问题:
不同类型后缀的不同函数:
int findi(void* list, int i)、int findd(void* list, double d)- 但我不喜欢这种方法,这对我来说似乎是多余的,而且 API 令人困惑。-
使用联合:
typedef union { int i; double d; char c; ... } any_type;但是通过这种方式,我强制用户了解
any_typeunion,并在调用find之前创建它。我想避免这种情况。 使用可变参数函数:
int find(void* list, ...)。我喜欢这种方法。但是,我担心参数数量没有限制。用户可以随意写int x = find(list, 1, 2.0, 'c'),虽然我不知道它应该是什么意思。
我也看到了这个问题的答案:C : send different structures for one function argument 但这无关紧要,因为我想接受非指针参数。
处理这个函数的正确方法是什么?
【问题讨论】:
-
我会做方法 #1 并使用使用新 C11
_Generic的宏来区分类型。