当前位置 博文首页 > 广大菜鸟的博客:C语言也可以实现泛型(转)

    广大菜鸟的博客:C语言也可以实现泛型(转)

    作者:[db:作者] 时间:2021-09-16 22:25

    原文地址:https://www.cnblogs.com/wuyudong/p/c-general-function1.html

    #include<string.h>
    #include<stdio.h>
    // C 语言也可以实现一定的泛型编程,但这样是不安全的,系统对其只有有限的检查。在编程时一定要多加细心。
    /*变量是不能声明为 void 无类型的。而你不知道调用此函数传进的参数是什么类型的,无法确定一种类型的声明。
    同时,不能将 * 用在无类型指针上,因为系统没有此地址指向对象大小的信息。在编译阶段,编译器无法得知传入此函数参数的类型的*/
    void swap(void*v1,void*v2,int size){
    	char buffer[size];
    	memcpy(buffer,v1,size);
    	memcpy(v1,v2,size);
    	memcpy(v2,buffer,size);
    }
    void* search(void*key,void*base,int n,int elementSize){
    	for(int i=0;i<n;i++){
    		void*element = (char*)(base)+ i*elementSize;
    		if(memcmp(key,element,elementSize)==0)
    			return element;
    	}
    	return NULL;
    }
    int intCmp(void*elem1,void*elem2){
    	int* e1 = (int*)elem1;
    	int* e2 = (int*)elem2;
    	return *e1-*e2;
    }
    void * search1(void*key,void*base,int n,int elementSize,int(*cmpfn)(void*,void*)){
    	for(int i=0;i<n;i++){
    	void*element = (char*)base+ i*elementSize;
    	if( cmpfn(key,element)==0)
    		return element;
    	}
    	return NULL;
    } 
    int main(){
    	// 1、交换值
    	int x=0,y=1;	
    	printf("x=%d,y=%d\n",x,y);
    	swap(&x,&y,sizeof(int));
    	printf("x=%d,y=%d\n",x,y);
    	int a[10];
    	for(int i=0;i<10;i++)	a[i] = i+1;
    	int key=8;
    	// 2、查找	
    	if(search(&key,&a,10,sizeof(int))!=NULL) {
    		printf("Founded\n");
    	}else{
    		printf("NULL\n");
    	}
    	// 3、查找 
    	int*found = (int*)search1(&key,&a, 10, sizeof(int),intCmp);
    	if(found!=NULL) {
    		printf("Founded\n");
    	}else{
    		printf("NULL\n");
    	}
    }
    

    在这里插入图片描述

    cs