如果没有为被调用函数提供大量帮助就可以完成它,这样它就可以完成它的工作.查看标准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值是指向数据打印机功能所需的任何控制信息的指针(它可能像FILE *一样简单,可能更复杂).数据打印机功能返回的值是写入的字符数;从prarray()返回的值是写入的字符总数.
当然,这仅适用于一维数组.要打印2D或3D阵列的子部分,您需要更复杂的代码.如果您需要担心换行符等,那很可能是ctxt的域.或者您为此功能设计了更复杂的接口.请注意,为指定值分隔符提供的唯一机制是通过ctxt结构.这将起作用(或可以起作用),但它可能太笨拙了.
带有_Generic的C2011解决方案很有意思,但N类型需要N个函数,每个类型都处理打印数组.我无法完全摆脱:我的解决方案需要N 1个函数,但只有其中一个(1)处理数组; N个函数都处理打印给定类型的单个值,这比打印给定类型的整个数组更简单.当然,如上所述,它需要在每个相关平台上使用C 2011编译器.由于至少有一个“经常相关”的平台没有供应商提供的C 1999编译器,因此可能需要一段时间才能在该平台上使用C 2011.