export關鍵字的用法

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){return   a+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 <typename   Type> 
Type   sum(Type   a,Type   b);//函數模版的聲明 

#include   "test.cpp " 

test.cpp文件的內容: 
template <typename   Type> 
Type   sum(Type   a,Type   b) 

        return   a+b; 
}//函數模版的定義 

first.cpp文件的內容: 
#include   "test.h " 
int   main() 

        sum(2,3); 
        return   0; 


second.cpp文件的內容: 
#include   "test.h " 
int   second() 

        sum(2,3); 
        return   0; 



所以爲了避免完全編譯模式的這種低效率,出現了局部編譯模式 


///////舉例說明局部編譯模式 
(1)test.h頭文件中不需要再include   "test.cpp " 
(2)需要使用sum的cpp文件中只需要include   "test.h "即可 
(3)在實例化sum函數時,編譯器會自動跟蹤到sum函數模版的定義(通過export關鍵字) 
(4)這樣就提高了編譯速度 

test.h頭文件的內容: 
template <typename   Type> 
Type   sum(Type   a,Type   b);//函數模版的聲明 

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

test.cpp文件的內容: 
export   template <typename   Type> //前面加上export關鍵字 
Type   sum(Type   a,Type   b) 

        return   a+b; 
}//函數模版的定義 

first.cpp文件的內容: 
#include   "test.h " 
int   main() 

        sum(2,3); 
        return   0; 


second.cpp文件的內容: 
#include   "test.h " 
int   second() 

        sum(2,3); 
        return   0; 



綜上所述:export關鍵字只有在使用局部編譯模式時纔會用到,同時需要編譯器支持局部編譯模式,如果編譯器不支持這種編譯模式,那麼不能使用export

發佈了6 篇原創文章 · 獲贊 2 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章