Transcript 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修飾過的變數,經過宣告後,記
憶體就不會改變,下次執行時不再重新宣告。
void GO(){
static int c=0;
printf(“%d\n”,++c);
}
int main(){
int i;
for(i=0;i<10;i++)
GO();
}
static的另一個意義
加上static修飾詞的變數(或函數),只會被
允許在這個檔案中使用,其他程式碼都無
法使用。
gcc compiler
gcc
gcc是C的編譯器,在UNIX環境下可以直
接使用,在windows環境下可以下載或從
Dev-C++資料夾中的bin資料夾中找到。
在windows環境下若設環境變數,則可在
command line直接呼叫。
使用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
$gcc code.c -o code
這是make沒有其他參數的情況
需要特別注意這邊的檔名不加附檔名
若附檔名為c以gcc編譯,若為cpp則以
g++編譯。
描述文件
make的描述文件代表的是程式碼與程式碼
之間的依賴關係(規則),並依照此關係依序
編譯。
目標檔案:需要檔案1 需要檔案2…
<TAB>產生指令
all:test.o test2.o
gcc test.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
<signal.h>提供了一個手段
(signal function),可以在當程式發生不
可預期情況(例如ctrl+c,除以0…等等)
時,作例外處理。
當然,使用的時候就要include<signal.h>
Signal常數
Signal
Explanation
SIGABRT
Abnormal termination of the program (such as a call to function abort).
SIGFPE
SIGILL
An erroneous arithmetic operation, such as a divide by zero or an operation
resulting in overflow.
Detection of an illegal instruction.
SIGINT
Receipt of an interactive attention signal.
SIGSEGV
An invalid access to storage.
SIGTERM
A termination request set to the program.
節自上課投影片
Signal函式
*signal( int signal, void (* func) (int))
Signal函式會偵測常數為signal的狀況,
並以func例外處理,並回傳函數的指標,
如果發生錯誤會回傳SIG_ERR。
raise函式
raise(int signal);
直接造成某種signal發生。