當前位置:編程學習大全網 - 編程語言 - 在c語言中如何實現函數模板

在c語言中如何實現函數模板

如果要寫個函數支持多種數據類型,首先想到的就是C++的模板了,但是有時候只能用C語言,比如在linux內核開發中,為了減少代碼量,或者是某面試官的要求…

考慮了壹陣子後,就想到了qsort上.qsort的函數原型:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

快排時,只要自己實現相應數據類型的比較函數cmpare就可以了.如果比較int型時,壹個典型的compare函數如下:

那麽,就是說可以利用void *. void *意指未指定類型,也可以理解為任意類型。其他類型的指針可以直接賦值給void *變量,但是void *變量需要強制類型轉換為其它指針類型。這個相信大家都知道。那麽下面以壹個簡單的題目為例,來探討如何在C語言中實現模板函數。

方法1: 利用void *.

在看下面的源程序之前,需要了解幾點。首先,在32位平臺上,任何類型的指針所占的字節都是4個字節,因為32位機器虛擬內存壹般為4G,即2的32次方,只要32位即4個字節就可以足夠尋址,sizeof(void *)=4; 其次,雖然各種不同類型的指針所占的空間都為4個字節,但是不同類型的指針所指的空間的字節數卻不同(這壹點尤為重要,下面的程序我在開始沒有調通就因為這點意識不強)。所以,如果妳將壹個指針強制轉換為另壹個類型的指針,指針本身所占的字節是不變的,但是,如果對這個指針進行運算,比如 *p,p++,p-=1等壹般都是不同的。 再次,函數指針應該了解下,這裏不多說。 最後,因為Sandy跟我說,C++開始的時候模板的實現其實就是利用宏替換,在編譯的時候確定類型。所以,為了方便,類型也用了預編譯指令#define。

<span>#include?"stdio.h"</span>

<span>#include?"stdlib.h"</span>

<span>//typedef?int?T;?//或者下面的也可以.</span>

<span>#define?T?int</span>

//這個FindMin是Sandy寫的.felix021也寫了個,差不多的就不貼出來的.

void?FindMin(const?void?*arr,int?arr_size,int?arrmembersize,int?*index,

int?(*cmp)(const?void?*,const?void?*b)){

int?i;

*index=0;

char?*p=(char?*)arr;

char?*tmp=p;

for?(i=1;i<arr_size?;i++){

if?(cmp(tmp,p)>0){

tmp=p;

}

p+=arrmembersize;

}

(*index)=((int)(tmp-arr))/arrmembersize;

}

*/</span>

可以把指針看作是char?*,如果轉換為int?*,那下面的位移就不正確了.</span>

index<span>=</span>i<span>;</span>

<span>}</span>

<span>}</span>

<span>return</span>?index<span>;</span>

<span>}</span>

<span>int</span>?result<span>;</span><span>//result保存的是最小值索引.</span>

result<span>=</span>FindMin<span>(</span>arr,<span>12</span>,

  • 上一篇:關於怎樣寫作文的公眾號
  • 下一篇:[高分急等]匯編語言,請大神修改代碼....
  • copyright 2024編程學習大全網