c語言有兩把雙刃劍,一把是「指標」,另一把是「巨集」。這回咱就用「巨集」來實現c++中才有的模版。這裡的模版實現乙個很簡單的加法函式,同乙個函式**可以處理不同型別的加法運算。
c++的實現
template t add(t a, t b)
#include int main(int argc, const char *ar**)
c語言的實現
// add.h
// 定義演算法函式
_type _func(_type a, _type b)
#undef _type
#undef _func
// add.c
// 定義add函式,實際上是巨集
#define add(t, a, b) (add_ ## t ((a), (b)))
// 建立型別為int的例項函式
#define _type int
#define _func add_int
#include "add.h"
// 建立型別為char的例項函式
#define _type char
#define _func add_char
#include "add.h"
// 建立型別為float的例項函式
#define _type float
#define _func add_float
#include "add.h"
#include int main(int argc, const char *ar**)
預處理結果
使用gcc -e add.c輸出預處理結果,實際上定義了三個函式,main函式中分別呼叫了不同的函式。(下面的預處理結果刪除了stdio.h標頭檔案的部分)
# 1 "add.h" 1
int add_int(int a, int b)
# 7 "add.c" 2
# 1 "add.h" 1
char add_char(char a, char b)
# 11 "add.c" 2
# 1 "add.h" 1
float add_float(float a, float b)
# 15 "add.c" 2
int main(int argc, const char *ar**)
C語言巨集實現模版函式
h檔案可以宣告巨集定義模版函式 在其它檔案中只要包含了該.h檔案,就可以使用這些函式 define convert declare suffix,t,filename extern void suffix filename const scalar s,t buf,int cn,int unroll...
C語言實現memcpy
memcpy和memmove都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,他們的作用是一樣的,唯一的區別是,當記憶體發生區域性重疊 的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。程式設計師面試寶典中有例題 對應的原型如下 v...
C語言實現多型
c 中的多型是指 通過基類物件的指標或者基類物件的引用呼叫虛函式 表現更多派生類的特性,但根據c 多型的實現,我們發現這種方法存在一定的空間和效率的折損。不可否認,多型輕鬆解決了很多任務程中遇到的問題,這與 pure c 的解決方法比起來,更為優雅。在考慮移植性上,c 的光芒要蓋過 c 但 c 的多...