C语言理论上并不支持泛型编程,因此对于一些通用算法通常都采用函数指针+void *强制类型转换来实现,但是对于一些数据结构,并不支持类似C++的标准库的各种通用结构的实现。
想要实现相应的效果,还可以采用宏编程来实现,同普通的函数不同,宏扩展可以忽视类型信息,从而简化用户使用。
可以学习/usr/include/tgmath.h中的写法。
采用void *指针加上sizeof数据类型大小来得到类型的方法要考虑不同机器上的数据大小不同,非常麻烦。
现在还没弄明白宏的写法
帖一点自己写的有问题的代码
#include <stdio.h>
#include "debug_util.h"
#define Iprint_array(array, size) \
{int i; \
printf("array_elements = [\n"); \
for (i = 0; i < size; ++i) { \
if( i && i%8 == 0) putchar('\n'); \
char *strformat = \
(sizeof(*array) == sizeof(double) ? "%.6d," : \
sizeof(*array) == sizeof(long long) ? "%lld," : \
sizeof(*array) == sizeof(long) ? "%ld," : "%d," \
); \
printf(strformat, array[i]); \
} \
printf("\b]\n"); \
}
void print_array(void *array, int size) {
int i;
char *strformat =
(sizeof(*array) == sizeof(double) ? "%.6d," :
sizeof(*array) == sizeof(long long) ? "%lld," :
sizeof(*array) == sizeof(long) ? "%ld," : "%d,"
);
printf("array_elements = [\n");
for (i = 0; i < size; ++i) {
if ( i && i%8 == 0 )
putchar('\n');
if (sizeof(*array) == sizeof(double)) {
printf(strformat, *(double *)(array+i*8));
} else if (sizeof(*array) == sizeof(long long)) {
printf(strformat, *(long long *)(array+i*4));
} else if (sizeof(*array) == sizeof(long)) {
printf(strformat, *(long *)(array+i*4));
} else {
printf(strformat, *(int *)(array+i*4));
}
// printf("%d,", array[i]);
}
printf("\b]\n");
// Iprint_array(array, size);
}