c 函式模板 編譯模式 export 關鍵字

2021-06-07 16:18:04 字數 1820 閱讀 5242

1.函式模版的編譯模式分兩種:完全包含編譯模式和區域性編譯模式(需要用export關鍵字) 

2.不同的編譯器對這兩種編譯模式的支援各不相同,但一般都支援完全包含編譯模式,具體支援情況需要參照具體使用的編譯器文件 

模版函式和普通函式在使用的時候有一定的區別: 

(1)普通函式在使用的原始檔中直接include該函式的宣告即可 

(2)模版函式在使用的原始檔中既要include模版函式的宣告,也要include模版函式的定義(因為只有在編譯的時候,根據模版函式的定義進行例項化後生成的函式才是真正的函式定義) 

/舉例說明完全包含編譯模式: 

(1)test.h中在宣告的後面include   "test.cpp ",這樣做的目的是把sum的宣告和定義放在兩個檔案中 

(2)first.cpp和second.cpp中都用到了sum函式模版,所以都要include   "test.h ",所以在兩個cpp檔案中都有乙份sum的定義,所以在例項化以後,存在兩個相同的函式定義:int   sum(int   a,int   b) 

(3)對於這種重複定義的問題,完全包含編譯模式下,編譯器自己會去除冗餘的函式定義,而只保留乙個int   sum(int   a,int   b)函式的定義 

(4)所以這種編譯模式下,編譯效率會降低(因為如果100的cpp檔案中都呼叫了sum(2,3),那麼會存在100個int   sum(int   a,int   b)函式的定義,去除其餘99個冗餘定義的操作會占用大量的編譯時間) 

test.h標頭檔案的內容: 

template

type   sum(type   a,type   b);//函式模版的宣告 

#include   "test.cpp " 

test.cpp檔案的內容: 

template

type   sum(type   a,type   b) 

//函式模版的定義 

first.cpp檔案的內容: 

#include   "test.h " 

int   main() 

second.cpp檔案的內容: 

#include   "test.h " 

int   second() 

所以為了避免完全編譯模式的這種低效率,出現了區域性編譯模式 

///舉例說明區域性編譯模式 

(1)test.h標頭檔案中不需要再include   "test.cpp " 

(2)需要使用sum的cpp檔案中只需要include   "test.h "即可 

(3)在例項化sum函式時,編譯器會自動跟蹤到sum函式模版的定義(通過export關鍵字) 

(4)這樣就提高了編譯速度 

test.h標頭檔案的內容: 

template

type   sum(type   a,type   b);//函式模版的宣告 

//#include   "test.cpp "//不需要包含sum函式的定義 

test.cpp檔案的內容: 

export   template //前面加上export關鍵字 

type   sum(type   a,type   b) 

//函式模版的定義 

first.cpp檔案的內容: 

#include   "test.h " 

int   main() 

second.cpp檔案的內容: 

#include   "test.h " 

int   second() 

綜上所述:export關鍵字只有在使用區域性編譯模式時才會用到,同時需要編譯器支援區域性編譯模式,如果編譯器不支援這種編譯模式,那麼不能使用export

c 函式模板

include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...

c 函式模板

關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...

C 函式模板

c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...