c語言,函式,函式,c語言,函式,函式模板

2022-03-03 22:41:46 字數 4743 閱讀 5143

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語言遞迴呼叫的理解 所謂遞迴,...