1樓:匿名使用者
那是c++自帶的模板庫,c的很少,而且**長難記且功能少,基本可以忽略。
要是用c的話,函式基本要自己寫的
在c語言中如何實現函式模板
2樓:go陌小潔
各種用 c 語言實現的模板可能在使用形式上有所不同。現以一個求和函式 sum 為例,用 c++ template 可寫如下:
template r sum(const t *array, int n)
如果不是內建型別,該模板隱式地需要 有r r::operator+=(t)運算子可用。
1. 使用函式指標作為 functor 替換者
typedef struct tagaddclass
addclass;
void sum(addclass* self, const char* array, int n)
使用時:
void addint(char* r1, const char* r2)
addclass addclass = ;
int array[100];
read(array);
2. 用巨集作為functor的替換者
#define gensumfun(sumfunname, add, rettype, elemtype)
rettype sumfunname (const elemtype *array, int n) \
使用時:
#define addint(x, y) ((x) += (y))
gensumfun(sumint, addint, long, int) …..
int array[100];
read(array);
long sum = sumint(array, 100); …..
3. 所有可替換引數均為巨集
至少需要一個額外的檔案(實現檔案)為 impsum.c
/* impsum.c */
rettype funname(const elemtype *array, int n)
使用時:
#undef rettype
#undef funname
#undef elemtype
#undef add
#define addint(x, y) ((x) += (y))
#define rettype long
#define funname sumint
#define elemtype int
#define add addint
#include impsum.c …..
int array[100];
read(array);
long sum = sumint(array, 100);
4. 總結:
第一種方法,易於跟蹤除錯,但是效率低下,適用於對可變函式(函式指標)的效率要求不高,但程式出錯的可能性較大(複雜),模板函式(sum)本身很複雜,模板引數也比較複雜(add)的場合。
第二種方法,效率高,但很難跟蹤除錯,在模板函式和模板引數本身都很複雜的時候更是如此。
第三種方法,是我最近幾天才想出的,我認為是最好的,在模板引數(add)比較複雜時可以用函式(第二種也可以如此),簡單時可以用巨集,並且,易於除錯。在模板函式本身很複雜,而模板引數比較簡單時更為優越。但是,可能有點繁瑣。
3樓:椴
如果要寫個函式支援多種資料型別,首先想到的就是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。
#include "stdio.h"
#include "stdlib.h"
//typedef int t; //或者下面的也可以.
#define t int
//這個findmin是sandy寫的.felix021也寫了個,差不多的就不貼出來的.
void findmin(const void *arr,int arr_size,int arrmembersize,int *index,
int (*cmp)(const void *,const void *b))
}return index;
}int result;
//result儲存的是最小值索引.
result=findmin(arr,12,
4樓:天蠍神經俠侶
#include
#include
typedef int elemtype;
elemtype add(const void *a,const void *b)
void main()
以add()函式上函式實現了int型別和char型別的共同藉口。
利用void型別來實現c函式過載,在某種意義上可以減少**量。
5樓:匿名使用者
那是c++自帶的模板庫,c的很少,而且**長難記且功能少,基本可以忽略。
要是用c的話,函式基本要自己寫的
c語言函式模板問題
6樓:匿名使用者
首先,c沒有函式模版。c++才有。
其次,template 是函式宣告的一部分,所以下面函式實現應該是:
template
void swap(t &a,t &b)
最後,#include ,在標準的c++函式中,std的域中已經有一個swap函式。
而且前面也using namespace了。函式宣告重複。
兩個辦法:
1 swap(i,j);改為 ::swap(i,j); //全域性化。
2 swap改個名字。
7樓:董俊錕
#include "stdafx.h"
#include
template
void myswap(t &a,t &b); //因為標準模板庫中有swap函式,系統不能識別,我只要函式名改一下就可以了
int main()
8樓:兔子和小強
#include
using namespace std; //引入std名稱空間
template
在iostream定義過了,換個名字
int main()
9樓:
把這句int temp;
改成t temp;
10樓:傳說中的
函式的定義也帶上template
c語言模板函式與自定義函式的區別及優缺點
11樓:吉祥二進位制
c語言中有模板函式嗎? 模板不是c++中才提供的特性的嘛,大部分函式都是自定義函式。沒有什麼優點或者缺點吧,完全看函式自身的功能
12樓:亞歷士缺德
不會把庫函式叫做模板函式吧???
c語言函式模板中的非型別引數問題
13樓:莊政警
這些都復是c++的玩意
是個陣列制的引用, 如果去掉括號,就變成引用的陣列,而引用的陣列是不存在的,改成t*就成了第二種定義了
用引用當引數,比如min(a),a就是實參本身,而不是副本,這是c語言所沒有的特性. 既然是實參本身,那麼陣列a就不會退化為指標,也就是說,編譯器可以可以獲得a的大小,所以size就不需要提供了
而第一種和第二種,arr退化為指標了,所以必須通過其他途徑提供陣列長度,
設計C語言函式,設計一個C語言函式
define n 10 void fun temp n int i 0,j 0 for i 0 i 設計一個c語言函式 急求 c語言 設計一個函式獲得1 20的一個隨機數.子函式的定義該怎麼寫呀?謝謝 include include include int rnd0 int n int main i...
c語言中的abs函式,c語言中的abs函式ifabsx1x21什麼意思abs不是返回絕對值嗎
這條語句意思是 如果x1 x2的絕對值等於1,則if的條件成立,此時表示式abs x1 x2 1 的值是1,即條件成立。意思就是判斷x1 x2的差的絕對是不是等於1唄 y zeros fftsize,1 y 20 log10 abs x1 subplot 3,1,2 在matlab中,這些語句都什麼...
c語言函式遞迴的理解,C語言函式遞迴的理解
對於遞迴,我大致引用一位計算機競賽教練的話 皇帝傳近臣 幫我算一下1 2 3等於多少 然後近臣傳太監 幫我算一下2 3等於多少 太監回近臣 2 3 5 然後近臣回皇帝 1 2 3 1 5 6 這裡每個人為一次函式呼叫。即是說 從頭探到尾,在尾處找到答案後,再回傳給頭。c語言遞迴呼叫的理解 所謂遞迴,...