如何编写C函数接受任何类型的(一个)参数

Bar*_*ber 7 c types variadic any

我正在为C中的列表实现简单的库,我在编写find函数时遇到了问题.

我希望我的函数接受任何类型的参数来查找,和: 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;
    
    Run Code Online (Sandbox Code Playgroud)

    但是这样我强迫用户既知道了any_typeunion,又在调用之前创建它find.我想避免这种情况.

  • 使用可变函数:int find(void* list, ...).我喜欢这种方法.但是,我担心没有对参数数量的限制.用户可以自由写,int x = find(list, 1, 2.0, 'c')虽然我不知道它应该是什么意思.

我也看到了这个问题的答案:C:为一个函数参数发送不同的结构,但它无关紧要,因为我想接受非指针参数.

处理此功能的正确方法是什么?

Aus*_*oke 7

您可以尝试实现类似于通用函数的函数bsearch,它可以对任何数据类型的数组执行二进制搜索:

void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
              int (*compar)(const void *, const void *))
Run Code Online (Sandbox Code Playgroud)

您不是硬编码函数内不同数据类型的不同实现,而是将指针传递给将执行类型相关操作的函数,并且只知道底层实现.在您的情况下,这可能是某种遍历/迭代功能.

另一件事bsearch需要知道(除了显而易见的 - 搜索键和数组长度)是数组中每个元素的大小,以便它可以计算数组中每个元素的地址并将其传递给比较函数.


如果你有一个有限的类型列表要操作,那么拥有一系列findX()函数就没有错.上述方法需要将每种数据类型的bsearch函数传递给函数,但是主要区别之一是不需要重复共同的功能,并且通用函数可以用于任何数据类型.

我不会说有任何正确的方法可以做到这一点,这取决于你并且真正取决于你想要解决的问题.