如果不对被调用函数提供大量帮助,您将无法做到这一点,以便它可以完成工作。查看标准 C 库中的两个“多态”函数,qsort()
以及bsearch()
.
void qsort(void *base, size_t nel, size_t width,
int (*compar)(const void *, const void *));
void *bsearch(const void *key, const void *base, size_t nel,
size_t width, int (*compar)(const void *, const void *));
printf()
和scanf()
系列是处理多种类型的其他函数。
您的打印数组函数可能需要:
typedef int (*DataPrinter)(void *ctxt, void *data);
extern int prarray(void *base, size_t nel, size_t width,
DataPrinter pr_func, void *ctxt)
数据打印机函数指针将负责打印一个由data
参数指定的值。该ctxt
值是指向数据打印机功能所需的任何控制信息的指针(它可能像 a 一样简单FILE *
,也可能更复杂)。数据打印机函数返回的值是写入的字符数;从返回的值prarray()
是写入的字符总数。
当然,这只适用于一维数组。要打印 2D 或 3D 数组的子部分,您需要更复杂的代码。如果您需要担心换行等问题,那很可能是ctxt
. 或者您为此功能设计更复杂的接口。请注意,为指定值分隔符提供的唯一机制是通过ctxt
结构。这将起作用(或可以使其起作用),但它可能太笨拙了。
C2011 的解决方案_Generic
很有趣,但需要 N 个函数用于 N 种类型,每个函数都处理打印一个数组。我无法完全摆脱:我的解决方案需要 N+1 个函数,但其中只有一个(1 个)处理数组;N 个函数分别处理打印给定类型的单个值,这比打印给定类型的整个数组更简单。当然,如前所述,它需要在每个相关平台上都有一个 C 2011 编译器。由于至少有一个“经常相关”的平台没有其供应商提供的 C 1999 编译器,因此您可能需要一段时间才能在该平台上使用 C 2011。