C 函式模版分離編譯

2021-06-16 13:32:22 字數 1817 閱讀 6730

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 函式模版

如果需要多個將同乙個演算法用於不同型別的函式,請使用模版 函式模版 要讓編譯器知道程式需要乙個特定形式的交換函式,只需在程式中使用swap 函式即可,編譯器將檢查所使用的引數型別,並生成相應的函式,1.template void swap anytype a,anytype b anytype te...

C 之函式模版

函式模版是通用的函式描述,有時候也被稱為引數化型別。建立模版如下 template void swap any a,any b template void swap job job1,job job2 void show job j int main template void swap job j...

4 7 C 函式模版

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