gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:10:08 25 4
gpt4 key购买 nike

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

我希望我的函数接受任何类型的参数来查找,包括:查找(my_list, 3)查找(my_list, my_int_var_to_find)我已经知道什么是列表元素的类型

目前我已经找到了几种处理这个问题的方法:

  • 不同类型后缀不同的函数:int findi(void* list, int i), int findd(void* list, double d) -但我不喜欢这种方法,这对我来说似乎是多余的,而且 API 令人困惑。

  • 使用 union :

    typedef union {
    int i;
    double d;
    char c;
    ...
    } any_type;

    但通过这种方式,我强制用户了解any_type union ,并在调用find 之前创建它。我想避免这种情况。

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

我也看到了这个问题的答案:C : send different structures for one function argument但这无关紧要,因为我想接受非指针参数。

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

最佳答案

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

void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *))

与其在函数内对不同数据类型的不同实现进行硬编码,不如将指针传递给一个函数,该函数将执行依赖于类型的操作,并且只有它知道底层实现。在您的情况下,这可能是某种遍历/迭代函数。

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


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

我不会真的说有任何正确的方法来做到这一点,这取决于您,并且实际上取决于您要解决的问题。

关于c - 如何编写 C 函数接受(一个)任何类型的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12444385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com