template顯式執行個體化與隐式執行個體化
模闆執行個體化都是在編譯期完成的,不管是顯式執行個體化還是隐式執行個體化。
差別是隐式執行個體化隻有到編譯器發現某個模闆執行個體需要用到時,才會進行執行個體化。顯式執行個體化可以提前告訴模闆去為某個類型進行執行個體化,無論後面會不會用到它。
是以,顯式執行個體化可以将模闆的聲明和定義分離,隐藏實作,前提是我們隻會用到被顯式執行個體化的幾個類型。而隐式執行個體化不可以,如果分離,編譯時會無法連結(因為找不到定義/實作)。
https://en.cppreference.com/w/cpp/language/class_template
typename使用規範
對于用于模闆定義的依賴于模闆參數的名稱,隻有在執行個體化的參數中存在這個類型名,或者這個名稱前使用了typename關鍵字來修飾,編譯器才會将該名稱當成是類型。除了以上這兩種情況,絕不會被當成是類型。
連結器指令
-I 指定頭檔案最先搜尋目錄,即最先搜尋的include檔案目錄,-I.為優先搜尋目前目錄下頭檔案
-L 指定庫檔案最先搜尋目錄,即最先搜尋的lib檔案目錄,-L.為優先搜尋目前目錄下庫檔案
-l 對靜态庫和動态庫的縮寫,就是對對應的後面參數加上lib,然後加上對于靜态庫,字尾為.a,對于動态庫,字尾為.so
-static 由連結器構造一個完全連結的可執行目标檔案,可以直接加載運作,而無需更進一步的連結,檔案會很大
編譯器指令
-D宏名 在編譯時定義宏,-Dkey=value為在編譯時定義宏名為key,值為value的宏,常用于此處的宏偉DEBUG,DDEBUG,來标記編譯形式。
建構庫檔案
-shared -fpic 建構動态連結庫,輸出一般為源檔案前加lib後加.so字尾,輸入為源代碼檔案
對于-fpic無法編譯的檔案,使用-fPIC重新編譯,編譯建構工具為gcc,實際建構中使用-shared參數調動連結器對以位置無關性參數編譯生成的.o檔案進行連結
ar rcs 為建構靜态連結庫的工具,輸入為.o檔案,需優先使用gcc将源檔案編譯為.o檔案,再使用ar工具進行建構,輸出為源檔案名前加lib後加.a字尾
由此可見,庫檔案都是由.o檔案組合而成
局部靜态變量
使用局部靜态變量,來控制第一次調用函數和未來調用函數的不同操作
static bool wait = false;
if (wait) {
if (condition) {
wait = false;
}
return 0;
}
wait = true;
return 0;