很遗憾,C语言本身并不支持真正意义上的泛型编程,但是可以通过一些方法在一定程度上实现泛型编程.

例如使用void *进行类型擦除,实现一定程度上的"泛型";使用_Generic关键字等…

使用void*类型擦除来实现

泛型实现一些算法

swap()函数

一般的swap只能特定处理某一种类型:

void swap(int*a, int*b);

可以使用void*擦除类型,并用memcpy()进行数据处理:

1
2
3
4
5
6
void swap(void *a,void *b,int size){
char buf[size]; // gcc allows
memcpy(buf,a,size);
memcpy(a,b,size);
memcpy(b,buf,size);
}

顺序表lsearch()函数

同理,这次用memcmp()进行数据比较:

1
2
3
4
5
6
7
8
void* lsearch(void* base,int n,void* key,int elemSize){
for(int i = 0;i<n;++i){
void *elemPtr = (char*)base + i*elemSize;
if(memcmp(key,elemPtr,elemSize) == 0)
return elemPtr;
}
return NULL;
}