250 likes | 470 Views
extern. Extern 修飾詞. extern. 變數在全域中不能重複宣告相同的變數名稱,但不同程式碼可能會用到相同的變數。 extern 修飾詞代表這個變數宣告在其他地方。 函數也可加上 extern ,但是可加可不加 ( 函數模型 ) EX : void func (); extern void func ();. extern example. // XD.c int XD=100; ------------------------------------------------------ // main.c
E N D
extern Extern修飾詞
extern • 變數在全域中不能重複宣告相同的變數名稱,但不同程式碼可能會用到相同的變數。 • extern 修飾詞代表這個變數宣告在其他地方。 • 函數也可加上extern,但是可加可不加(函數模型) • EX : void func(); extern void func();
extern example • //XD.c • int XD=100; • ------------------------------------------------------ • //main.c • #include<stdio.h> • extern int XD; • int main(){printf(“%d\n”,XD);}
extern的初始化 • 若在宣告具有extern修飾的變數時初始化,會視為沒有extern,需要特別注意。 • extern int XD=2; • • Int XD=2;
static Static修飾詞
static變數 • 經由static修飾過的變數,經過宣告後,記憶體就不會改變,下次執行時不再重新宣告。 • void GO(){ static int c=0;printf(“%d\n”,++c);} • int main(){inti; for(i=0;i<10;i++) GO();}
static的另一個意義 • 加上static修飾詞的變數(或函數),只會被允許在這個檔案中使用,其他程式碼都無法使用。
gcc compiler GCC
gcc • gcc是C的編譯器,在UNIX環境下可以直接使用,在windows環境下可以下載或從Dev-C++資料夾中的bin資料夾中找到。 • 在windows環境下若設環境變數,則可在commandline直接呼叫。
使用gcc編譯檔案 • $gcc -o 輸出檔名 要編譯的檔案(s) • 若無指定輸出檔名,UNIX下預設為a.out,windows下預設為a.exe。
編譯的過程 • 編譯檔案(將原始碼編譯) • 產生目的檔(產生.o檔) • 鏈結函式庫(根據目的檔及使用者的指令鏈結需要用到的函式庫) • 產生執行檔(產生最後的執行檔)
使用gcc產生目的檔 • $ gcc –c 原始碼.c • 則會產生原始碼.o的目的檔 • 若要將目的檔產生執行檔,與一般的編譯方式相同。
編譯優化參數 • -O0:預設狀態 • -O1:初步最佳化 • -O2:進一步最佳化,為推薦的優化。 • -O3:不要用,很可怕。最危險的編譯等級,有可能發生錯誤,在gcc4.x中甚至不被推薦使用。 • -pipe:加速編譯時間,對結果無影響。
make • make是一個很方便的工具,可以依據提供的描述檔,迅速幫你執行完很多編譯相關的指令。 • 與gcc相同,UNIX環境下有預設,windows環境下則需要下載並設定環境變數。
最簡單的編譯 • $make code • $gcccode.c -o code • 這是make沒有其他參數的情況 • 需要特別注意這邊的檔名不加附檔名 • 若附檔名為c以gcc編譯,若為cpp則以g++編譯。
描述文件 • make的描述文件代表的是程式碼與程式碼之間的依賴關係(規則),並依照此關係依序編譯。 • 目標檔案:需要檔案1 需要檔案2… • <TAB>產生指令 • all:test.o test2.o • gcctest.o test2.o -o test.exe • test.o:test.c • gcc -c test.c • Test2.o:test2.c • gcc -c test2.c
make的執行過程 • make會從名稱為all(不一定產生的檔名就叫做all)的規則執行(若沒有all則從第一個執行) • 接著尋找目錄中是否存在所有需要檔案,若有缺少則尋找其他規則是否可以產生需要檔案。
描述文件的位置 • make -f 描述文件 • 若沒有特別指定,make或尋找檔名為Makefile或makefile的文件
#include<signal.h> Signal handling
Signal • <signal.h>提供了一個手段(signal function),可以在當程式發生不可預期情況(例如ctrl+c,除以0…等等)時,作例外處理。 • 當然,使用的時候就要include<signal.h>
Signal常數 節自上課投影片
Signal函式 • *signal( int signal, void (* func) (int)) • Signal函式會偵測常數為signal的狀況,並以func例外處理,並回傳函數的指標,如果發生錯誤會回傳SIG_ERR。
raise函式 • raise(int signal); • 直接造成某種signal發生。